網頁

2020/9/29

Java 執行緒 Reentrant Synchronization

Java Reentrant Synchronization(可重入同步化)機制


在多執行緒(multi-thread)程序中,一執行緒必須取得另一執行緒釋放的同步化對象的鎖(lock)後才能存取同步化資源。而Reentrant Synchronization是指,若一執行緒已持有鎖,當執行另一需要相同鎖的區塊時可直接再取得同個鎖並存取。

例如下面ReentrantSyncfoo()bar()都是synchronized方法,且foo()中又調用了bar()。當ㄧ執行緒持有foo()的鎖時(也就是ReentrantSync的物件鎖),可直接獲取同個鎖並存取bar(),因為兩同步方法的鎖是同一個。

ReentrantSync

package com.abc.demo;

public class ReentrantSync {

    public synchronized void bar() {
        System.out.println(Thread.currentThread().getName() + " - bar()");
        // some code
    }

    public synchronized void foo() {
        System.out.println(Thread.currentThread().getName() + " - foo()");
        // some code
        bar();
    }
}

package com.abc.demo;

public class Main {

    public static void main(String[] args) {

        ReentrantSync r = new ReentrantSync();

//        Thread a = new Thread(new Runnable() {
//            @Override
//            public void run() {
//                r.foo();
//            }
//        }, "thread-a");

        Thread a = new Thread(r::foo, "thread-a"); // Java 8 lambda

        a.start();
    }

}

thread-a - foo()
thread-a - bar()

如果沒有Reentrant Synchronization,則當執行緒在foo()中調用bar()時,因為bar()的鎖被執行緒自己持有無法釋放會導致dead lock。


沒有留言:

張貼留言