锁消除:是JIT即时编译器对锁的优化
因为正常都是多个线程去竞争同一把锁,但是当前代码中每调用一次m1方法就会创建一个新的对象,也可以理解为每个线程对应了一把新的锁,没有竞争的情况,毫无意义,所以叫锁消除。
/**
* 锁消除
*/
public class SynchronizedUpDemo2 {
static Object object = new Object();
public static void m1(){
//锁消除问题 JIT即时编译器会无视它
Object o = new Object();
synchronized(o){
System.out.println(o.hashCode()+"\t"+object.hashCode());
}
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(()->{
SynchronizedUpDemo2.m1();
},String.valueOf(i)).start();
}
}
}
锁粗化:
JIT 会将首尾相接,前后相邻且都是锁同一个对象的代码块,JIT即时编译器就会把这几个synchronized块合并为一个大块。
/**
* 锁粗化
*/
public class SynchronizedUpDemo3 {
static Object object = new Object();
public static void main(String[] args) {
//JIT 会将首尾相接,前后相邻且都是锁同一个对象的代码块,JIT即时编译器就会把这几个synchronized块合并为一个大块,
// 如下。,申请一次锁即可,避免次次申请和释放。
// synchronized (object){
// System.out.println("aaaaa");
// System.out.println("bbbbb");
// System.out.println("ccccc");
// System.out.println("ddddd");
// }
new Thread(()->{
synchronized (object){
System.out.println("aaaaa");
}
synchronized (object){
System.out.println("bbbbb");
}
synchronized (object){
System.out.println("ccccc");
}
synchronized (object){
System.out.println("ddddd");
}
}).start();
}
}