我注意到有趣的行为(对我来说令人惊讶):
public void m(){
int primitive=1;
synchronized (primitive) {
}
}
此代码生成以下内容:
int is not a valid type's argument for the synchronized statement
你能解释为什么吗?
最佳答案
基元只是一个裸值,仅此而已。这是原始的全部要点,它尽可能简单。添加锁是一项开销,即添加4个字节,并且对象的整个标头可以为16个字节。
只有对象支持方法并已同步。
重要的原因是byte
使用一个字节,但是可以锁定的Byte
使用16到24个字节。如果您有一个包含数百万个缓冲区的缓冲区,那么在不需要锁的情况下支持锁似乎是一种浪费。
顺便说一句,除非您喜欢混淆,否则切勿锁定局部变量或可变变量。