我注意到有趣的行为(对我来说令人惊讶):

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个字节。如果您有一个包含数百万个缓冲区的缓冲区,那么在不需要锁的情况下支持锁似乎是一种浪费。

顺便说一句,除非您喜欢混淆,否则切勿锁定局部变量或可变变量。

09-08 07:38