我注意到有趣的(令我惊讶的)行为:
public void m(){
int primitive=1;
synchronized (primitive) {
}
}
此代码生成以下内容:
int is not a valid type's argument for the synchronized statement
你能解释一下原因吗?
最佳答案
原语只是一个纯粹的值,没有别的。这就是原语的全部要点,它尽可能简单。添加锁是一个开销,即增加了 4 个字节,而 Object 的整个 header 可以是 16 个字节。
只有对象支持方法和同步。
重要的原因是一个字节
使用一个字节,但是一个可以锁定的字节
使用16到24个字节。如果您有一个包含数百万个这样的缓冲区,那么如果您不需要它,那么对锁的支持似乎是一种浪费。
顺便说一句,除非你喜欢混淆,否则你永远不应该锁定本地或可变变量。
关于java - 为什么我不能使用原语作为同步部分的互斥体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24504642/