相比synchronized,ReentrantLock新增的三个高级功能

news/2024/5/17 17:22:40 标签: java, 多线程, synchronized, reentrantlock

Java在保证线程安全问题上可以从两个层面来保证线程安全:

  • 1、JVM层面,JVM层面保证线程安全是通过synchronized来实现的
  • 2、Java API,Java API方面可以通过JUC并发包中的ReentrantLock来实现

在JDK1.5之前synchronized的性能是弱于ReentrantLock的,但是在JDK1.5之后,对synchrnized进行了一些优化,使得synchronized跟ReentantLock在性能上差别不大,JDK1.5之后主要对synchrnized的优化有:适应性自旋锁、锁消除、锁粗化、轻量级锁、偏向锁等。

但是相比synchrnized来说,ReentantLock增加了三大高级功能,分别是:

  • 1、等待可中断:等待可中断是指当持有锁的线程长期不释放锁,那么正在等待的线程可以选择放弃等待,转而处理其它事情。可中断的特性对于处理执行时间非常长的同步块有很好的帮助。
  • 2、公平锁:公平锁是指多个线程在等待同一个锁时,必须按照申请锁的时间顺序来获得锁,可以理解为操作系统中的先来先服务。synchrnized是非公平锁,任何一个等待锁的线程都有可能获得锁,ReentrantLock默认情况下也是非公平的,但是可以通过构造函数来设定使用公平锁。
  • 3、锁可以绑定多个条件:锁可以绑定多个条件是指ReentrantLock可以绑定多个Condition对象,而在synchronized中,锁对象的wait()、notify()、notifyAll()方法可以实现一个隐含的条件,如果要和多个条件进行关联时,就不得不多添加锁,而ReentrantLock则无需这样做,只需要多次调用newCondition()方法就可以实现。

http://www.niftyadmin.cn/n/1366576.html

相关文章

《Java后端知识体系》系列之从源码让你明白Spring是如何解决循环依赖的?

怎么出现循环依赖的异常呢?写了一个例子来实现? Component public class ModelA {private ModelB modelB;Autowiredpublic ModelA(ModelB modelB){this.modelB modelB;} }Component public class ModelB {private ModelA modelA;Autowiredpublic Model…

什么对象可以作为GC Root对象

知之为知之,不知为不知,是知也! Java虚拟机中判断对象是否可回收有两种方式: 引用计数法可达性分析法 对于可达性分析法,我们知道需要存在一个GC Root的对象作为起点,从这个节点开始向下搜索,…

《Java后端知识体系》之带你认识Paxo算法是如何选举的?

知之为知之,不知为不知,是知也! 今天学习zookeeper涉及到了其中的paxos算法,抽空研究了一下paxos算法是如何进行选举的! 角色 Proposer提议者:负责提出议案,也就是value(vaue是paxos协议中将操作…

《Java后端知识体系》之带你初识什么是zookeeper及其它的选举过程

知之为知之,不知为不知,是知也! Zookeeper 角色 Leader: 主要负责处理事务相关的操作,负责给Follower发布命令,处理Follower的反馈信息负责同步消息,将消息同步到Follower中可以保证事务处理的…

《Java后端知识体系》之理解Restful架构

知之为知之,不知为不知,是知也! Restful架构 一、什么是Restful 来自百度百科 RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务使…

《Java后端知识体系》之Redis的整数集合底层实现

1.整数集合简述 整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。 例如当我们创建只包含五个元素的集合键,并且集合键中所有元素都是整数…

《Java后端体系系列》之Redis跳跃表是如何跳的

原文发布在语雀 一、定义 跳跃表是一种有序的数据结构,它通过在每个节点中维持多个指向其它节点的指针来达到快速访问节点的目的。 如下图:节点1有指向节点2、节点3、节点4的指针,这样如果要访问节点4的数据,节点1可以直接通过指…

《Java后端知识体系系列》之Redis的RDB持久化(一)

1.介绍 1.1什么是数据库状态 Redis是一个键值对数据库服务器,服务器中包含任意个非空数据库,而每个非空数据库中又包含任意个键值对,为了方便起见我们将服务器中的非空数据库以及他们的键值对统称为数据库状态。 1.2为什么要进行持久化&am…