解惑

解己之惑,解人之惑

看的东西太多也容易忘啊

前段时间面试的时候问到的一个问题,实现一个线程安全的计数器,我已经让类变成Singleton了,set方法也变成同步的了,这个时候面试的人问,如果这个程序是工作在多CPU的机器上,发现这个计数器仍然存在计数不准确的情况会是因为什么?我的回答是:JDK的bug,呵呵,面试的人说不是,JDK提供了修正的机制,就是把计数的那个变量标记为volatile,这样就可以防止,今天有空搜索了下这个关键字,发现我以前翻译的一个文章《破除java神话之三:原子操作都是线程安全的》说的就是这个问题,虽然不是完全匹配,但是机制就是这样的,多处理器有各自的寄存器,所以可能有问题,使用volatile关键字就可以让JVM在读写那个变量的时候都从主存读写,而不在本地保存副本。

(Visited 198 times, 1 visits today)

4 Comments

  1. 已经定下来了。

  2. 这个问题的答案是什么呢?
    为什么会出现计数不准确呢?

  3. Java会进行优化,会把那个计数器放在例如CPU的计数器里面,总之就是不是从内存读取,这样就会有问题,加了以后就强制从内存读写了

wmgreat进行回复 取消回复

邮箱地址不会被公开。 必填项已用*标注

© 2024 解惑

本主题由Anders Noren提供向上 ↑