文章目录
并发三大特性与JMM内存模型
并发编程Bug的源头:原子性、可见性和有序性问题
原子性
原子性:保证一个线程中的一次或多次操作不会被其他线程打断
在64位的操作系统中,对基本类型的读取和赋值语句是能保证原子性的。但i++ i-- 这类操作不能保证原子性
在32位的操作系统中,是不能保证long 、double 这类64位变量的原子性;我们可以使用volatile,它可以保证单个变量赋值操作的原子性。
保证原子性的方式:
- 加锁,加synchronized锁或者是Lock显示锁
- CAS操作,但CAS只能保证单个变量的原子性
可见性
可见性:多个线程访问同一个共享变量,一个线程修改了,其他线程能立刻读取到修改后的值
下面这个案例就是有可见性问题,线程1一直跳不出循环
public class Visible {
private static boolean flag = true;
public static void readFlag(){
while (flag){
}
System.out.println("跳出循环...");
}
public static void main(String[] args) throws InterruptedException {
new Thread(() -> readFlag()).start();
Thread.sleep(100);
flag = false;
System.out.println("main thread end..."