JAVA并发三大特性,原子性,可见性,有序性
JAVA并发三大特性
一、原子性
定义:操作是不可分割的最小单位。
作用:防止多线程同时修改共享变量导致的数据不一致问题。
实现机制:
- synchronized关键字:通过锁机制确保代码块或方法在同一时间只被一个线程执行,从而保证原子性。
- Lock类(如ReentrantLock):提供比synchronized更灵活的锁定方式,同样保证原子性。
- Atomic*类:提供不可变变量和原子操作方法,确保单个操作的原子性。
二、可见性
定义:一个线程对共享变量的修改能被其他所有线程立即看到。
作用:避免线程因缓存导致的数据不一致问题。
实现机制:
- volatile关键字:强制JVM确保变量的修改对所有线程可见,禁止JVM进行指令重排序优化。
- synchronized和Lock类:在获得锁和释放锁的过程中自动确保可见性。
三、有序性
定义:操作按预期顺序执行,避免乱序问题。
作用:防止多核处理器或编译器的指令重排序导致的操作顺序混乱。
实现机制:
- 内存屏障(Memory Barrier):通过插入内存屏障指令来确保特定操作的顺序性。例如,Thread#yield()、Object.wait()等方法内部使用内存屏障。
- synchronized和Lock类:通过控制锁的获取和释放过程,隐式地保证一定的有序性。
- Java内存模型中的happens-before规则:定义了不同操作之间的顺序关系,以避免数据 races。
总结
- 原子性确保操作不可分割,防止中间状态问题。
- 可见性确保变量变化对所有线程可见,避免缓存不一致。
- 有序性确保操作按预期顺序执行,避免指令重排序带来的错误。