2012-03-01 40 views
3

我知道wait()方法總是寫在同步方法/塊中,並鎖定對象,但我只想知道當所有方法都在Thread類中時出現了什麼問題?爲什麼wait,notify和notifyAll方法在Object Class中?

+0

的可能重複[?爲什麼等待()和notify()在Java中的Object類中聲明(http://stackoverflow.com/questions/1769489/why-are- wait-and-notify-declared-javas-object-class) – gnat 2013-01-09 11:08:37

回答

4

它們也在Thread類中。但是這裏的一個線程實例同樣適合作爲任何其他對象的同步對象。

另外,已經有人質疑sun的這個決定了,因爲現在每個對象都承擔着可以同步的負擔,而恕我直言,他們早就應該將這個重構出來分離對象。

如果我需要的東西同步時,我經常這樣做:

private Object syncObject = new Object(); 

然後,我可以做我

synchronized(syncObject) 
代碼

無處不在,沒有與任何人打擾在this上意外同步。

+1

這是多少負擔? – 2012-03-01 12:18:46

+1

每個對象攜帶一個8字節的標題。如果我們不必能夠在對象上同步,那麼一個4字節的頭部(類ref)可能就足夠了。但是,我不知道額外頭文件的某些字節是否仍然需要用於GC,但是此信息可能仍然會嵌入到4字節頭文件中。 – Daniel 2012-03-01 12:21:40

4

在Thread對象上使用它們的問題是Thread爲了自己的目的而使用這個鎖。這很可能導致混亂和奇怪的錯誤。

1

這些方法的上下文是與Java中每個對象相關的鎖,因此我們無法將它們移動到Thread類。例如,我們可能會這樣做。線程1將一個項目添加到列表中並通知其他線程。線程2等待列表更新並執行一些操作:

thread 1 
synchronized (lock) { 
    list.add(item); 
    lock.notifyAll();  
} 

thred 2 
synchronized (lock) { 
    list.wait(); 
    ... do something with list 
} 

如果將這些方法移動到某個線程,那麼我們在這裏完成的操作將不可能。

相關問題