volatile 和 synchronized
Topic source可能导致线程安全的问题:原子性问题、有序性问题、可见性问题
JAVA构建内存模型JMM来应对,其中volatile解决可见性+有序性问题,原子性问题解决思路本质是互斥,只能使用锁来解决,比如synchronized或者CAS
volatile只保证每个线程读到的数据是最新值,但不能保证多个线程对同一个变量的操作的原子的,
synchronized并不涉及数据的初始值,它只保证同步代码块内的代码同一时刻只能有一个线程访问
例如以下代码,结果可能是0,1,2之中的任意一个
Thread A = new Thread(() -> {
Counter.count++;});
Thread B = new Thread(() -> {
Counter.count++;});
A.start();
B.start();
System.out.println(Counter.count);
- 1
🌙
我觉得2刚刚好相反
volatile 保证每个线程读取的数据 最新值
synchronized 是为了保证 数据安全 每次都要拿到 初始值
class Counter {
public static final Object lock = new Object();
public static volatile int count = 0;
}
只加 volatile 不加 鎖 并不能实现线程安全