锁粗化
虚拟机遇到一连串连续的对同一锁不断的进行请求和释放的操作,把所有的锁操作整合成对锁的一次请求
synchronized (lock){for(int i=0;i<20;i++){// do sth }}
锁偏向
如果一个线程获得锁,那么就进入偏向模式,下次再次请求锁时,无须进行同步操作,节省了锁申请的时间,对于锁竞争比较激烈的场合不佳,这样会导致偏向模式失效
JAVA虚拟机参数 -XX:+UseBiasedLocking开启
轻量级锁
把对象头部作为指针,指向持有锁线程的内部堆栈,来判断线程是否持有对象锁
子旋锁
当前线程暂时无法获得锁,本应该挂起,但是虚拟机进行一次赌博,CPU循环几次(空循环),如果可以得到锁,那么进入临界区,如果不能,进行挂起
锁消除
Java虚拟机在JIT编译时,通过上下文的扫描,去除不可能存在共享资源竞争的锁,比如使用了StringBuffer Vector