一、线程安全问题
1、造成线程安全的五大原因
①操作系统的随机调度 (根本原因) ②两个线程同时修改同一个变量 ③修改变量操作不是原子的 ④内存可见性问题 ⑤指令重排序问题
第①跟第②我们无法直接解决,于是往往从第③种着手
2、synchronized 的特性
引入 synchronized 本质是通过两个线程之间产生锁竞争来确保在同一个线程下的修改操作是原子的(包括读改写三步)
另外 synchronized 本身还具有几个重要特性:
①互斥性
同一时刻,只能有一个线程拥有这把锁
过程如下:线程 A 获得锁---线程 B 阻塞等待---线程 A 释放锁---线程 B 获得锁
package JavaEE;
public class Demo13 {
private static int sum;
// synchronized 的互斥性,线程 1 拿到锁线程 2 再申请就会阻塞
public static void main(String[] args) throws InterruptedException {
// 啥类型的锁都可以
Object lock = new Object();
Thread t1 = new Thread(() -> {
for (int i = 0; i < 50000; i++) {
// 只对 sum 加了锁,外部的还是可以并发执行
// 本质是引入了锁竞争
synchronized (lock) {
// 看似只有一步操作,在 cpu 上面有三步
sum++;
}
}
});
(() -> {
( ; i < ; i++) {
(lock) {
sum++;
}
}
});
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(sum);
}
}



