Java 为什么我不能使用原语作为syncronized部分的互斥体?

Java 为什么我不能使用原语作为syncronized部分的互斥体?,java,multithreading,concurrency,primitive,critical-section,Java,Multithreading,Concurrency,Primitive,Critical Section,我注意到有趣的行为让我惊讶: public void m(){ int primitive=1; synchronized (primitive) { } } 此代码生成以下内容: int is not a valid type's argument for the synchronized statement 你能解释一下原因吗?原语只是一个简单的值,没有别的。这是原语的全部要点,它尽可能简单。添加锁是一种开销,即它会添加4个字节,

我注意到有趣的行为让我惊讶:

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

        }
    }
此代码生成以下内容:

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

你能解释一下原因吗?

原语只是一个简单的值,没有别的。这是原语的全部要点,它尽可能简单。添加锁是一种开销,即它会添加4个字节,而对象的整个头可以是16个字节

只有对象支持方法和同步

重要的原因是一个字节使用一个字节,但是一个可以锁定的字节使用16到24个字节。如果您有一个包含数百万个锁的缓冲区,那么如果您不需要锁,那么支持锁似乎是一种浪费


顺便说一句,除非您喜欢混淆,否则永远不要锁定本地或可变变量。

可能的重复,因为它需要一个对象。具体来说,该重复如何回答以下问题:MonitorCenter需要一个对象。基本体不是对象。JVM无法在它们上同步。这会复制到一个非常好的页面:@hyde这绝对是另一个问题