Java并发08:并发编程的三大核心问题 - 原子性、可见性、有序性
引言:为什么synchronized能解决所有问题? // volatile只解决部分问题 private volatile int count = 0; count++; // 仍然不安全! // synchronized解决所有问题 private int count = 0; public synchronized void increment() { count++; // 安全 } 为什么? 关键在于理解并发编程的三大核心问题: 原子性(Atomicity) 可见性(Visibility) 有序性(Ordering) 一、原子性(Atomicity) 1.1 什么是原子性? 定义:一个操作或多个操作,要么全部执行且执行过程不被打断,要么都不执行。 int a = 10; // ✅ 原子操作 a++; // ❌ 非原子操作(3条指令) 1.2 哪些操作是原子的? 原子操作: // ✅ 基本类型的读写(long/double除外) int a = 1; boolean b = true; // ✅ 引用类型的读写 Object obj = new Object(); // ✅ volatile变量的读写 volatile int count = 0; count = 1; // 原子的 非原子操作: // ❌ long/double(64位,需要两次操作) long value = 123L; // 非原子的(未加volatile) // ❌ 复合操作 count++; // read-modify-write array[index]++; // 非原子 // ❌ check-then-act if (map.get(key) == null) { map.put(key, value); // 竞态条件 } 1.3 如何保证原子性? 方式1:synchronized public synchronized void increment() { count++; // 整个方法是原子的 } 方式2:Lock private Lock lock = new ReentrantLock(); public void increment() { lock.lock(); try { count++; } finally { lock.unlock(); } } 方式3:原子类 private AtomicInteger count = new AtomicInteger(0); public void increment() { count.incrementAndGet(); // 原子操作 } 二、可见性(Visibility) 2.1 什么是可见性? 定义:当一个线程修改了共享变量,其他线程能够立即看到这个修改。 ...