自旋锁
线程想要获得一个对象的锁,如果没有得到,会继承占用CPU尝试获取锁, 线程不进入阻塞状态,仍然在Running
锁消除
1 public void lockTest() { 2 3 String aa = "ABC"; 4 synchronized (aa) { 5 System.out.println(aa); 6 } 7 }
对于局部变量,没有必要加锁, 运行时JIT进行逃逸分析会自动去掉monitorenter monitorexit. javap -v反编译看不出来
锁粗化
1 String aa = "ABC"; 2 3 public void lockTest() { 4 5 for (int i = 0; i < 10000; i++) { 6 synchronized (aa) { 7 System.out.println(aa); 8 } 9 } 10 }
循环中频繁加锁释放锁, 会被JIT优化成
1 String aa = "ABC"; 2 3 public void lockTest() { 4 synchronized (aa) { 5 for (int i = 0; i < 10000; i++) { 6 System.out.println(aa); 7 } 8 } 9 }