Java Reentrant Synchronization(可重入同步化)機制
在多執行緒(multi-thread)程序中,一執行緒必須取得另一執行緒釋放的同步化對象的鎖(lock)後才能存取同步化資源。而Reentrant Synchronization是指,若一執行緒已持有鎖,當執行另一需要相同鎖的區塊時可直接再取得同個鎖並存取。
例如下面ReentrantSync
的foo()
與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。
沒有留言:
張貼留言