synchronized与CAS(更新)
synchronized(重量级锁)
synchronized概念
原子性:synchronized保证语句块内操作是原子的
可见性:synchronized保证可见性(通过“在执行unlock之前,必须先把此变量同步回主内存”实现)
有序性:synchronized保证有序性(通过“一个变量在同一时刻只允许一条线程对其进行lock操作”)
synchronized原理
Java字节码层级:
synchronized(o)
字节码层级:
使用javap -c Synchronize可以查看编译之后的具体信息。monitorenter指令插入到同步代码块的开始位置,monitorexit指令插入到同步代码块的结束位置,JVM需要保证每一个monitorenter都有一个monitorexit与之相对应。任何对象都有一个monitor(在对象头中)与之相关联,当且一个monitor被持有之后,他将处于锁定状态。线程执行到monitorenter指令时,将会尝试获取对象所对应的monitor所有权,即尝试获取对象的锁;
CPU汇编层级:lock comxchg
CAS(轻量级锁)
CAS概念
Compare And Swap (Compare And Exchange) / 自旋 / 自旋锁 / 无锁 (无重量锁),作用是保证多个线程对一个线程的更新。
CAS底层
自己写过的原子类:
AtomicInteger i = new AtomicInteger();
i.incrementAndGet();
点击incrementAndGet(),跳转到unsafe类:
public final int incrementAndGet() {
return unsafe.getAndAddInt(this, valueOffset,