Synchronized与ReentrentLock

本文介绍了Java5中新增的ReentrantLock机制,对比Synchronized关键字,ReentrantLock提供了更丰富的功能并适用于更复杂的场景。文章详细解释了ReentrantLock的各种方法及其实现的灵活性,包括lockInterruptibly、tryLock等特性。同时对比了Synchronized与ReentrantLock的性能差异,讨论了锁升级机制(偏向锁、轻量级锁和重量级锁)以及公平性和非公平性的区别。

Java5新增了一种机制ReentrentLock,在此之前只有Synchronized与Volatile;ReentrentLock而是提供了更多功能,适用更复杂场景。

public interface Lock {

    void lock();
    void lockInterruptibly() throws InterruptedException;
    boolean tryLock();
    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
    void unlock();
    Condition newCondition();
}

很灵活,lockInterruptibly在获取锁时可中断,tryLock()可轮询避免死锁,tryLock(long time, TimeUnit unit)可定时,可中断

性能

java6改进了内置锁的算法,Synchronized性能略差于ReentrentLock,但随着对内置锁的不断优化使得其表现要好于ReentrentLock
偏向锁/轻量级锁/重量级锁:这三种锁是指锁的状态,并且是针对Synchronized。在Java 5通过引入锁升级的机制来实现高效Synchronized。这三种锁的状态是通过对象监视器在对象头中的字段来表明的。
偏向锁是指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁。降低获取锁的代价。
轻量级锁是指当锁是偏向锁的时候,被另一个线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,提高性能。
重量级锁是指当锁为轻量级锁的时候,另一个线程虽然是自旋,但自旋不会一直持续下去,当自旋一定次数的时候,还没有获取到锁,就会进入阻塞,该锁膨胀为重量级锁。重量级锁会让其他申请的线程进入阻塞,性能降低。
锁的内部原理}

公平性

ReentrentLock提供公平锁与非公平锁(默认),非公平锁性能高是因为它允许”插队“,带来了高的吞吐量

二者之间选择

Doug Lea大神更推荐Synchronized,使用方便性能好,仅当Synchronized无法满足你的需求时,再考虑ReentrentLock

参考书籍

《Java并发编程实战》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值