Synchronized的工作过程:
(1)获得互斥锁
(2)从主内存拷贝变量的最新副本到工作的内存
(3)执行代码
(4)将修改后的共享变量刷新到主内存
(5)释放互斥锁
Synchronized的特性
(1)互斥:某个线程执行到某个对象的Synchronized中时,其他线程如果也执行到同一个对象的Synchronized就会阻塞等待,保证执行代码块的原子性
(2)刷新内存:会保证内存可见性(对值的修改能够被其他线程及时看到)
(3)可重入:不会把自己锁死
(4)对指令重排序有一定的约束
Synchronized的使用
(1)修饰代码块:明确指出锁的是哪个对象
(2)直接修饰普通方法:锁的是该实例
(3)修饰静态方法:锁的是类对象(XXX.class)
Synchronized的锁机制
最开始是乐观锁,如果锁的冲突频繁,就转为悲观锁
最开始是轻量级锁实现,如果锁的持有时间较长,就转为重量级锁
是一种不公平锁
不是读写锁
加锁过程:无锁-》偏向锁-》自旋锁-》重量级锁
偏向锁只是给对象头打上一个标记,记录这个锁属于哪个线程,本质上偏向于延迟加锁,如果没有其他线程来参与竞争就不会去真的加锁