在多核环境中使用原子操作的线程安全性

Nam*_*Lee 1 java multithreading

我听说单个原子操作是线程安全的,因为当核心处理原子操作时,核心在完成原子操作之前不会做任何其他操作.

例如,在32位操作系统的java中,有一个变量可供多个线程访问

 int a; 
Run Code Online (Sandbox Code Playgroud)

线程1写入

a = 3; 
Run Code Online (Sandbox Code Playgroud)

和线程2可以写

a = 4; 
Run Code Online (Sandbox Code Playgroud)

写入该变量的线程的顺序可能会改变,因此最终值可以是3或4,但我们可以确定写入int是一个原子操作,因此该变量中的32位不会混入一些不可预测的数字

我知道在单核环境中就是这种情况,因为核心在确定原子操作完成之前不会执行另一个线程的代码,

但是在多核环境中,另一个核心是否可能访问当前核心的原子操作下的变量?从而导致变量中的32位混淆?

ass*_*ias 5

不 - 这就是原子意味着什么:写作将永远成功"无干扰".因此,您将读取0(原始值),3或4但没有其他值.

在多核设置中会发生的情况是,如果线程T1在核心C1上写入3而线程T2在核心C2上写入4,则该值可能仅对进行写入的核心保持可见.因此,您int可能在C1中的值为3,在C2 中的值为4 .如果有第三个核心C3,它仍然可以看到原始值0.

为了防止这种不一致,您需要添加一些同步(例如,通过使int volatile).