synchronized
- 同步锁自己控制放行或者不放行
- 修饰的静态方法作用于这个类的所有对象
- 修饰的类作用于这个类的所有对象
volatile
- 不需要加锁,修改之后立即内存可见,直接存储在内存不需要进入到cpu
- 变量修饰符,仅仅可以用户变量,synchronized可以作用于变量和方法
- 标记的变量不会被编译器优化
ReentrantLock
- 多重锁,同意个线程可以调用多次锁形成多层锁,同一个线程进入一次,锁的计数器都自增1
- synchronized 是jvm层面实现的,reentrantlock是API层面的实现
- synchronized比较简洁,Reentrantlock需要手动处理
CAS(Compare-and-Swap)
- CAS指令需要3个操作数,内存地址,旧的预期,新值
- 存在ABA问题 AtomicStampedReference来解决ABA问题
- 自旋CAS(不成功,就一直循环执行,直到成功==)如果长时间不成功,会给CPU带来非常大的执行开