簡體   English   中英

JAVA方法中的互斥線程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM