原子性
原子性是指一个操作不可中断,要么完全成功,要么失败
- Atomic包,竞争激烈,性能好,但只能维持一个值
- synchrinized,不可中断,适合竞争不激烈的环境
- Lock,可中断,竞争激烈
Atomic
内部包含一个用volatile修饰的变量
private volatile int value;
实际操作的是unsafe类
private static final Unsafe unsafe = Unsafe.getUnsafe();
public final int getAndIncrement() {
return unsafe.getAndAddInt(this, valueOffset, 1);
}
原理为native的CAS(乐观锁)+自旋锁
synchrinized
synchrinized是根据monitor监视器实现的,这个监视器由native实现,大概原理为
线程A-》执行对象方法b
获取monitor失败-》等待
获取monitor成功
-》monitor的count+1
->线程A执行完成或wait时,释放monitor,count-1
PS:monitor同一时间只允许一个线程访问这个对象
Lock
Lock底层的实现原理是AQS