jvm 锁Lock

自旋锁

线程想要获得一个对象的锁,如果没有得到,会继承占用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     }
原文地址:https://www.cnblogs.com/yszzu/p/9273214.html