1.synchronized在加锁时要经历的几个阶段
1.未加锁
2.偏向锁
:偏向锁指的是先进行标记,而不是真正加锁,当产生竞争时才加锁
3.轻量级锁
4.重量级锁
除了锁升级以外的其它优化操作
1锁消除
编译器自动判定,如果这个代码不需要加锁,那就直接消除。例如StringBuilder中的append方法是待遇synchronized的,当这个代码在一个线程中运行时,就没必要考虑线程安全问题,就可以消除synchronzied。
StringBuffer sb = new StringBuffer();
sb.append("a");
sb.append("b");
sb.append("c");
sb.append("d");
2锁粗化
:一段逻辑中如果出现多次加锁解锁, 编译器 + JVM 会自动进行锁的粗化.
锁的粒度:
synchronized中包含代码的范围越大,锁的粒度就越大,反之越小。
锁的粒度越小,能更好提高线程的并发,但也增加了加锁解锁的次数。