2017-06-24 39 views
1

考慮下面的類:瞭解之前發生,關係

public myClass { 
    int a; 
    Object obj; //This object is not of class myClass nor of a subclass of it. 

    void foo(int b){ 
     synchronized(this){ 
      print(a); 
      a = b; 
      obj.value = b; 
      obj.bar(); 
     } 
    } 

    void bar(){ 
     synchronized(this){ 
      //Some code using obj here. 
     } 
    } 

} 

Java的單證指出:是,動作之間建立

當一個線程釋放的內在鎖,之前發生關係以及任何後續購買相同的鎖。

假設兩個線程T1,T2和myClass的一個對象叫做myclass。

現在T1調用foo,在T2調用bar之後不久,最終獲得鎖並進入bar()。如果錯誤糾正我,但據我瞭解T2看到T1.foo(b)變量a的變化。它如何對obj進行更改?考慮這個任意的其他對象。

是否有保證發生之前的關係?

+1

您的來源並不是真正的Java。 'int obj'是無意義的,如果'obj'是'Object',它沒有'value'或'bar()'方法。你應該清理你的例子。 – RealSkeptic

+0

Sry對於那個錯字,我試圖澄清。 –

回答

1

是:T2獲取T1釋放的鎖。所以有一個發生之前的關係,並且在釋放鎖之前由T1完成的寫入在獲得鎖之後由T2可見。

請參閱http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/package-summary.html#MemoryVisibility

請注意,它是關於內存操作,如共享變量的讀取和寫入。不僅讀寫正被用作鎖的對象的字段。

+0

在我的示例中調用obj.bar()很可能會調用自己的其他函數,這又可能會改變其他對象等,這是否覆蓋了?因此,當在我的示例中使用時,T2將看到我的函數調用T1完成的所有操作,當然只有那些更改在同步塊中,沒有限制? –

+0

實際上,我想知道的是,當A被A獲取鎖,釋放並被B獲取時,我確定我的理解正確。B能夠看到我們當前的任何對象/變量的任何更改由A完成的JVM環境雖然A持有鎖? –

+0

是的,就是這樣。 –