[英]Mutual thread exclusion in a JAVA method
我需要提供對類方法的相互訪問,因此,一個線程可以同時執行該方法中的代碼。 我已經嘗試過以下解決方案,但是我無法理解為什么每次“鎖定”變量的值都是false時,為什么。
public class MyCommand extends BaseCommand {
private static boolean locked=false;
@Override
public boolean execute() throws Exception {
synchronized(MyCommand.class){
while (locked){
wait();
}
locked=true;
//some code with a breakpoint/long blocking operations
locked=false;
notifyAll();
return true;
}
}
我在while語句的開頭放置了一個斷點,鎖變量的值始終為false,我不明白為什么。 第二個斷點在方法的主體中,我使用它來阻塞第一個線程的執行,並查看第二個線程中鎖住的變量的值更改了,但是不幸的是它沒有發生。 因此,最終結果是所有線程都能夠執行該方法而沒有任何線程安全性。 是否有人對我如何每次一次提供對該線程的獨占訪問有任何想法?
一次只有一個線程位於同步塊中,對嗎? 您可以在該塊的開頭停止線程,並檢查locked
的值。 好吧,如果您的線程位於該塊內,則意味着沒有其他線程。 如果沒有其他線程在里面,則locked
必須為false,這就是重點。 為什么會讓您感到驚訝?
您完全不需要由於上述原因while(locked) wait()
循環(或者就此而言,整個locked
事物)-整個“鎖定”是通過對代碼進行synchronized
鎖定來實現的。
該值始終為false,因為一次僅一個線程正在執行同步塊,因此...當第一個線程完成時,變量再次為false ...然后,下一個線程讀取為false。
我更喜歡在這種情況下使用ReentrantLock,例如:
protected final ReentrantLock myLock= new ReentrantLock();
...
try {
//wait until i have the lock
this.myLock.lock();
//do some stuff
} finally {
//release the lock
this.myLock.unlock();
}
在本文中,您可以看到synch部分與ReentrantLock之間在性能上的巨大差異: http : //lycog.com/concurency/performance-reentrantlock-synchronized/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.