2013-05-04 38 views
-1

下一個命令之前進行存儲變量值的我很好奇,如果值後,立即指派命令是這樣的:保證在java中

a = 5; 

有新的價值已被存儲到變量保修?如果這對於原始數據類型和其他數據類型是不同的?特別是對於Runnable對象。在包含MyClass的

我已經運行方法:

synchronized(this){ 
    while(pleaseWait){ 
     try { System.out.println("sleeping"); wait();} 
     catch (Exception e) {  e.printStackTrace(); } 
    } 
} 

是其他類我打電話方法sleepMe(),其中包含:

synchronized (myclass){ 
      myclass.pleaseWait = true; 
      myclass.notify(); 
} 

,問題是,我必須插入等待在調用sleepMe之後,MyClass的實例有時間更改myclass.pleaseWait的值?

我有幾個設置方法,其中我將複雜對象(對象的對象)分配給MyClass的實例。

感謝

回答

1

,你的兩個線程在同一對象上同步,這意味着由一個線程pleaseWait所做的更改將是可見的其他線程,當它從wait()調用返回。同步(在這種情況下,當您從wait()調用返回時重新獲得this上的鎖)提供了兩個線程之間所需的「發生之前」關係,以確保更新可見。

因此,要回答你的問題:

  • 任何解決方案都需要一個線程在某種意義上「等待」。這是問題所固有的。

  • 你在做什麼就足夠了。你不需要添加額外的等待。等待/通知機制可確保執行wait()的線程將看到該變量的最新副本......前提是所有更改都是在保持該對象鎖定的情況下進行的。

  • 你也可以使用更高級別的併發類來實現這種事情。

  • 你也可以使用volatile和「忙等待」來實現這個...但這將是一個非常糟糕的想法。

+0

我忘了複製粘貼通知從我的代碼,現在添加到問題 – rluks 2013-05-04 14:36:55