一、synchronized的底层原理
jdk6之前是互斥的死锁,即后续的线程会进入阻塞(系统调用切换线程导致性能降低),jdk6之后锁优化
有了偏向锁、轻量级锁、重量级锁、,由偏向锁逐步升级优化同步。
1、偏向锁
对象头(存着两部分内容)1、存着运行时的数据结构 2、存着方法区中对象的类型数据指针
当有线程访问锁时,锁的threadid会cas的操作尝试将线程的id记录到自己的运行时数据结构中,一旦cas操作成功则
虚拟机不再进行任何同步操作。cas操作不成功则说明有线程和它争抢锁则升级为轻量级锁。
2、轻量级锁
在线程的栈帧中建立一个锁的空间,cas的操作去锁的对象头中更新运行时数据到栈帧中的锁的空间,一旦操作成功则进行同步代码块操作,没有成功则说明有线程和它竞争。则检查对象头中的运行时数据是否指向当前栈帧。如果是则表明已经获得锁执行同步操作。
3、重量级锁
互斥锁,即为死锁,后续的线程都会进入阻塞状态。
二、synchronized如何保证可见性的
因为sychronized保证共享变量每次只有一个线程进行操纵,保证对共享变量的原子性。也就保证了共享变量的可见性。