并发编程三大特性(原子性、可见性、有序性)
并发编程的三大特性实际是JVM规范要求的JVM实现必须保证的三大特性
不同的硬件和不同的操作系统在内存管理上有一定的差异,JAVA为了解决这种差异,使用JMM(Java Memry Model)来屏蔽各个操作系统之间的差异,使得java可以实现跨平台操作;
一、原子性(并发编程的原子性)
1、什么是原子性?操作不可分割
2、JMM与原子性之间的关系:JMM规定,在java中,所有变量都是从主内存(虚拟机内存?)中复制一份到线程内存(CUP内存),在线程内存中做计算,再写回到主内存中(写回的操作不一定能立即执行),这就导致了在多线程并发的情况下,线程内存(cup内存)中读到的变量值不一定是最新的变量值,有可能被修改过,比如下面代码:
private static int count = 0;
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
add();
}
});
Thread t2 = new Thread(() -> {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
add();
}
});
t1.start();
t2.start();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(count);
}
public static void add() {
count++;
}
3、java中如何解决原子性问题?保证在并发情况下的数据正确性
二、可见性
三、有序性