偏向锁批量重偏向&批量撤销
当线程休眠4s以上,就会成为偏向锁,偏向于当前线程重复获取锁。当只有一个线程时,其开销可以忽略不计在多线程竞争激烈情况下,偏向锁不仅不能提升性能,而且会导致性能下降。
于是有批量重偏向和批量重撤销机制。
批量重偏向和撤销操作是对类的操作与对象无关
偏向锁重偏向一次后不可再重偏向
当某个类触发偏向撤销,jvm认为该类有问题,失去重偏向机会
自旋优化
重量锁竞争,自旋避免阻塞
自旋目的为了减少线程挂起的次数,尽量避免直接挂起线程 挂起操作涉及系统调用,存在用户态和内核态转换,这才是重量锁最大开销
锁粗化
对同一个对象反复加锁及解锁,甚至加锁操作出现在循环体中,加大锁同步的范围
锁消除
删除不必要加锁操作,线程安全场景下使用,可以加快效率
package com.example.demo.complicate.syn;
/**
* 锁消除
* //
* -XX:+EliminateLocks java8默认开启
* -XX:-EliminateLocks
*
* StringBuffer append方法是线程安全的,可以将锁消除
*/
public class LockEliminationTest {
public void append(String str1 , String str2){
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(str1).append(str2);
}
public static void main(String[] args) {
LockEliminationTest demo = new LockEliminationTest();
long start = System.currentTimeMillis();
for(int i=0; i<1000000000; i++){
demo.append("aa", "bb");
}
System.out.println(System.currentTimeMillis() -start);
}
}
逃逸分析
逃逸分析是分析对象动态作用域
分类: 方法逃逸和线程逃逸
开启逃逸分析,部分对象会在栈上分配