什么是一致性?
在并发编程中,Java 是通过共享内存来实现共享变量操作的,所以在多线程编程中就会涉及到数据一致性的问题。
我先通过一个经典的案例来说明下多线程操作共享变量可能出现的问题,假设我们有两个线程(线程 1 和线程 2)分别执行下面的方法,x 是共享变量:
//代码1
public
class
Demo
{
int
x
=
0
;
public
void
count
()
{
x
++;
System
.
out
.
println
(
x
)
}
}
如果两个线程同时运行,两个线程的变量的值可能会出现以下三种结果:
- 1,1
- 2,1
- 1,2
2,1 和 1,2 的结果我们很好理解,那为什么会出现以上 1,1 的结果呢?
在解释为什么会出现这样的结果之前,我们先通过下图来简单了解下 Java 的内存模型。
Java内存模型
Java 采用共享内存模型来实现多线程之间的信息交换和数据同步。程序在运行时,局部变量将会存放在虚拟机栈中,而共享变量将会被保存在堆内存中。
由于局部变量是跟随线程的创建而创建,线程的销毁而销毁,所以存放在栈中,由上图我们可知,Java 栈数据不是所有线程共