2014-07-01 35 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字节。如果你有一个有数百万个缓冲区的缓冲区,如果你不需要它,支持一个锁定似乎是一种浪费。

顺便说一句,除非你喜欢混淆,否则你绝不应该锁定一个局部变量或可变变量。

相关问题