synchronized锁优化

偏向锁批量重偏向&批量撤销

当线程休眠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);

    }
}

逃逸分析

逃逸分析是分析对象动态作用域

分类: 方法逃逸和线程逃逸
开启逃逸分析,部分对象会在栈上分配
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值