锁优化

本文深入探讨了并发控制技术,包括自旋锁、锁粗化、轻量级锁和偏向锁的概念与工作原理。自旋锁使线程在等待锁时保持活跃状态,锁粗化扩大了同步范围以减少频繁加锁,轻量级锁减少了重量级锁的性能消耗,而偏向锁则在无竞争情况下完全消除了同步。这些技术共同提升了多线程环境下的程序效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 自旋锁

如果物理机器有一个以上的处理器,能让两个或两个以上的线程同时并行执行,我们就可以让后面请求锁的那个线程稍微等一下,但是不放弃处理器的执行时间,看看持有锁的线程是否很快就会释放锁。为了让线程等待,我们只需让线程执行一个忙循环(自旋),这项技术就是自旋锁。

自旋等待本身虽然避免了线程切换的开销,但它是要占用处理器时间的,因此如果锁被占用的时间很短,自旋等待效果就会很好,但是如果锁占用处理器时间很长,那么自旋的线程只会白白地消耗处理器的资源,因此自旋等待的时间必须要有一定的限度。

二锁粗化

如果虚拟机探测到有这样一串零碎的操作都对同一个对象加锁,则会把加锁同步的范围扩展(粗化)到整个操作序列的外部。

三轻量级锁

轻量级锁并不是用来代替重量级锁的,是在没有多线程竞争的前提下,减少传统重量级锁使用操作系统互斥量产生的性能消耗。。

对象头分为两部分:一部分用于存储对象自身的运行时数据(MarkWord),另一部分用于存储指向方法区对象类型的数据之神

四偏向锁

如果说轻量级锁是在无竞争的情况下使用CAS操作去消除同步使用的互斥量,那么偏向锁就是在无竞争的情况下把整个同步都消除掉,连CAS操作都不做了。

偏向锁可以提高带有同步但无竞争的程序性能。

优化是指在多线程编程中,通过改进的机制和使用方式来提高程序的性能和并发能力。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、付费专栏及课程。

余额充值