2017-09-01 61 views
0

我是線程的新手,特別是​​關鍵字。同步塊

我知道如果一個線程的狀態改變爲BLOCKED,如果它試圖訪問另一個線程已經擁有該鎖的同步塊。

參考:

synchronized (objA){ 
    objA.methodA(); 
} 

//some code 

objA.methodB(); 

我的問題是另一個線程是否可以通過獨立的其他方法(在methodB()本示例)改變對象objA。或者擁有鎖意味着沒有其他線程可以以任何方式訪問/更改objA,也就是說,更改代碼是否在同步塊內?

+0

那麼是否有可能一個不同步的方法在'objA'上被調用,而另一個線程擁有該監視器呢? – JonJavaK

+0

是的。任何線程都可以隨時調用非同步方法,因爲它不需要任何鎖來調用它。 –

回答

1

同步對象會鎖定對象的監視器。
這意味着如果一個線程已經在同一個對象上的同步語句(或同步方法)中執行,那麼就不能執行對象的同步方法或同步語句。

但是沒有同步方法的事情是不同的。
事實上,任何線程都可以調用objA上的任何非同步方法,同時在同一個objA上的同步語句中執行線程。

2

不可以。擁有監視器(鎖)的唯一含義是,除非你放棄它,否則其他線程也不能擁有它。

當然,這並不意味着它們不能調用上objA任何​​方法(因爲需要獲取鎖),所以如果所有的上objA的修飾方法是同步的(或使用synchronized (this) {...}塊),則「不」成爲「是」。

但如果methodB從未試圖鎖定上this(通過被同步,或通過使用一個同步塊),則沒有鎖定上objA將阻止objA.methodB()呼叫量。

+1

請注意,正確同步的對象還需要同步方法**閱讀**受同步塊保護的狀態。只有同步「修改方法」是不夠的。 –

+0

@JBNizet好點!例外情況是如果該狀態位於'volatile'字段中 - 但這是一個更高級的主題。 – yshavit