java - 为什么我不能使用原语作为同步部分的互斥体?

标签 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 个字节,而 Object 的整个 header 可以是 16 个字节。

只有对象支持方法和同步。

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

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

关于java - 为什么我不能使用原语作为同步部分的互斥体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24504642/

相关文章:

java - 在 JPanel 中绘图时未绘制任何内容

Java - 使用指定注释执行类方法

multithreading - C++11 线程与 OpenMP 的简单并行循环。哪个,什么时候?

java - 同时读写 ConcurrentHashMap 的值对象

java - 虽然线程中的循环似乎没有运行

concurrency - 在 Clojure 中创建 10k+ 代理

java HttpUrlConnection POST : need to ask for a response for the POST to be committed?

java - CSS 在 IE8、IE9 中不工作,但在 IE10 及更高版本中工作

python - 处理必须协调任务的工作进程的 pythonic 方法是什么?

ios - 使用 GCD 实现并发读独占写模型