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
    评论
优化是指在多线程编程中,通过改进的机制和使用方式来提高程序的性能和并发能力。synchronized关键字是Java中最常用的机制之一,它可以保证同一时间只有一个线程可以进入被synchronized修饰的代码块。下面是一些synchronized优化的方法: 1. 减小的粒度:如果在一个方法中有多个synchronized代码块,可以考虑将这些代码块拆分成多个方法,以减小的粒度。这样可以使得多个线程可以并发执行不同的代码块,提高程序的并发性能。 2. 使用局部变量替代成员变量:在使用synchronized关键字时,尽量使用局部变量而不是成员变量。因为成员变量的访问需要通过对象实例来进行,而局部变量的访问是线程私有的,不需要加。 3. 使用同步代码块代替同步方法:在某些情况下,使用同步代码块比使用同步方法更加灵活。同步代码块可以指定的粒度,只对需要同步的代码进行加,而不是整个方法。 4. 使用volatile关键字:volatile关键字可以保证变量的可见性和禁止指令重排序,可以在一定程度上替代synchronized关键字。但是需要注意,volatile关键字只能保证单个变量的原子性,不能保证多个操作的原子性。 5. 使用Lock接口:Java提供了Lock接口及其实现类ReentrantLock,相比于synchronized关键字,Lock接口提供了更加灵活的机制。可以手动控制的获取和释放,可以实现公平和非公平,并且支持多个条件变量。 6. 使用读写:如果在多线程环境下,读操作远远多于写操作,可以考虑使用读写ReadWriteLock来提高程序的并发性能。读写允许多个线程同时读取共享数据,但只允许一个线程写入共享数据。 7. 使用并发集合类:Java提供了一些并发集合类,ConcurrentHashMap、ConcurrentLinkedQueue等,它们内部使用了一些优化的技术,可以提高多线程环境下的并发性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值