2014-02-24 16 views
0

我是java noob,所以請原諒我對這個問題的無知。 我被指示在工作中更新一些代碼以使其線程安全。我被指出了需要改變的那些代碼。您會在下面找到我的問題。在抽象類定義中調用getClass()方法到底有什麼用 - 也與threadsafety有關?

有一個叫做抽象類:AbstractServiceProcessor 在這個抽象類有如下面的代碼片段顯示的getClass()的調用:

finally 
     { 
      synchronized (getClass()) 
      { 
       progressMeter.mark(item.getChangeList().size()); 
       dsTimer.stop(); 
      } 
     } 

1問:什麼是synchronized (getClass())該怎麼辦?

第二個問題:我被指示將其更改爲synchronized (AbstractServiceProcessor.class) 這是怎麼回事?爲什麼我被指示改變這個?

非常感謝您的解釋。

+0

從理解[synchronized_block是什麼](http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html)和getClass()返回的內容開始。你也應該明白'.class'是什麼意思。 –

+0

非常感謝Sotirios的快速響應。你能提供2美分嗎? –

+0

你爲什麼不問那些要求你這樣做的人? –

回答

2

什麼是synchronized(getClass())應該做的?

它獲取由getClass()返回的Class對象的鎖。但是,你不應該使用它,因爲已經被指示。問題是,​​塊可能鎖定不同的Class對象,基於哪個子類對象調用該方法。由於getClass()返回對象的運行時類型。由於這個原因,兩個不同的線程,不應該同時執行該塊,最終最終會這樣做,因爲鎖定不一樣。這可能會在您的應用程序中造成嚴重錯誤

我被指示將其更改爲synchronized(AbstractServiceProcessor.class)。那該怎麼辦?爲什麼我被指示改變這個?

我已經解釋了爲什麼要你做這個改變。現在,在AbstractServiceProcessor.class上進行同步可確保始終鎖定相同的Class對象,而不管您調用方法的哪個子類對象。

+0

謝謝Rohit。 getClass()返回什麼?它是調用此方法的抽象類的實際子類嗎?我不明白的是,爲什麼我不想在抽象類中執行'getClass()'?我不應該獲得實施課程的鎖定嗎? –

+0

@TazMan你知道一個超類引用可以引用它的任何子類對象嗎? 'getClass()'返回該實際子類對象的'Class'實例。它在運行時決定。一般來說,你不會想鎖定那些你不確定它將會是什麼的對象。抽象類在這裏是不相關的。所有這種使用「同步」塊的情況都是如此。 –

+0

getClass()如何獲取子類?它應該得到當前調用的對象的類getClasss –

相關問題