2014-07-01 21 views
0

我注意到有趣(令人驚訝的對我來說)行爲:爲什麼我不能使用原語作爲syncronized部分的互斥體?

public void m(){ 
     int primitive=1; 
     synchronized (primitive) { 

     } 
    } 

此代碼生成以下內容:

int is not a valid type's argument for the synchronized statement 

你能解釋一下爲什麼嗎?

+0

[用什麼原語來實現synchronized關鍵字?](http://stackoverflow.com/questions/15684530/what-primitive-is-used-to-implement-the-synchronized-keyword) – hyde

+0

因爲它需要一個對象。 –

+0

要具體如何重複回答這個問題:'monitorenter'需要一個對象。基元不是對象。 JVM無法同步它們。 – hyde

回答

7

原始只是一個裸值,沒有別的。這是一個原始的整體,它儘可能簡單。添加一個鎖是一個開銷,即它增加了4個字節,並且該對象的整個報頭可以是16個字節。

只有對象支持方法和同步。

其重要的原因是byte使用一個字節,但可鎖定的Byte使用16到24字節。如果你有一個有數百萬個緩衝區的緩衝區,如果你不需要它,支持一個鎖定似乎是一種浪費。

順便說一句,除非你喜歡混淆,否則你絕不應該鎖定一個局部變量或可變變量。

相關問題