所以在Java中,我知道你可以使用對象的所謂「固有鎖定」來創建互斥區域,並確保內存可見性。 Java使得它特別容易隱含在this
對象的一些語法糖的內部鎖鎖,如:在Java中使用Thread對象的內部鎖定可以嗎?
public class Foo{
public synchronized doFoo(){
//doFoo is executed in an implicit synchronized block
//on the 'this' object
}
}
這是可以理解和接受的做法看守許多對象的成員字段。我不知道是當鎖定的對象是Thread
對象時,上述情況是否正常。例如,是否有任何理由避免以下情況?
public class Bar extends Thread{ //notice the 'extends Thread' here
public synchronized doBar(){
//doBar is executed in an implicit synchronized block
//on the 'this' object
}
}
現在,我要堅持我所知道的是更安全的東西,如:
public class Baz extends Thread{ //notice the 'extends Thread' here
private final Object explicitLockObject = new Object();
public doBaz(){
synchronized(explicitLockObject){
//doBaz impl
}
}
}
我的問題將得到雙重使用選項#2(Bar
爲例):
- 是否有關於上可能與這樣的鎖定策略衝突的主題本身同步現有JVM代碼或Java約定?
- 鎖定
this
通常意味着該對象的訪問應始終由該對象的內部鎖保護。在Bar
線程的情況下,這意味着我們暗示只要您觸摸Bar
線程,就應該在實例上進行同步。這似乎可能導致一些其他線程不必要地(甚至危險地)阻塞,直到Bar
完成/退出。
以上是有效的擔憂嗎?我覺得我需要這樣一個布賴恩戈茨燈塔:-)
1.嗯,有一個慣例,你不應該首先擴展'Thread':實現一個'Runnable',將它作爲構造函數參數傳遞給'Thread'(參見[this question](http ://stackoverflow.com/questions/541487/implements-runnable-vs-extends-thread))。現在,你會關心在'Runnable'上同步嗎? –
是的,我知道那個約定。說實話,這本來不是我的代碼,我也不打算重構。我知道'Runnable'會很好,因爲它沒有州行李。可惜!這不是我所擁有的,我很想知道這個答案。 – codeCogs
我建議開發人員更喜歡併發包中的新類,而不要使用原始線程。多線程代碼很難編寫。 – duffymo