ReentrantLock和Synchronized

ReentrantLock

1.继承关系
public class ReentrantLock implements Lock, java.io.Serializable
1.内部类
1.FairSync(final class FairSync extends Sync)公平

主要方法 1.final void lock 2.protected final boolean tryAcquire(int acquires)(获取锁可以通过返回值判断有没有获取成功)

2.NonfairSync(final class NonfairSync extends Sync)非公平(默认)

主要方法 1.final void lock 2.protected final boolean tryAcquire(int acquires)(获取锁可以通过返回值判断有没有获取成功)

3.Sync(static class Sync extends AbstractQueuedSynchronizer)
AbstractQueuedSynchronizer(数据结构为node双向链表ConditionObject为单向链表 源码解读)
在这里插入图片描述2.构造函数
1.ReentrantLock()型构造函数

public ReentrantLock() {
        // 默认非公平策略
        sync = new NonfairSync();
    }

2.ReentrantLock(boolean)型构造函数

public ReentrantLock(boolean fair) {
        sync = fair ? new FairSync() : new NonfairSync();
    }

3.属性

	// 序列号
    private static final long serialVersionUID = 7373984872572414699L;    
    // 同步队列
    private final Sync sync;

详细源码链接

Synchronized

synchronized是jvm实现的一种互斥同步访问方式,底层是基于每个对象的监视器(monitor)来实现的

Java中的对象锁和类锁:
对象锁是用于对象实例方法,或者一个对象实例上的(this),
类锁是用于类的静态方法或者一个类的class对象上的。
我们知道,类的对象实例可以有很多个,但是每个类只有一个class对象,所以不同对象实例的对象锁是互不干扰的,但是每个类只有一个类锁
详细链接

总结

Lock和synchronized有以下几点不同

	1 Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现 
  2 synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁
	3 Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断(ReentrantLock中的lockInterruptibly()方法使得线程可以在被阻塞时响应中断,比如一个线程t1通过lockInterruptibly()方法获取到一个可重入锁,并执行一个长时间的任务,另一个线程通过interrupt()方法就可以立刻打断t1线程的执行,来获取t1持有的那个可重入锁。而通过ReentrantLock的lock()方法或者Synchronized持有锁的线程是不会响应其他线程的interrupt()方法的,直到该方法主动释放锁之后才会响应interrupt()方法)
	4 通过Lock可以知道有没有成功获取锁,而synchronized却无法办到
	5 Lock可以提高多个线程进行读操作的效率
	6 synchronized是非公平锁 Lock可以设置公平非公平

在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。所以说,在具体使用时要根据适当情况选择。
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值