问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

java 锁有几种

发布网友 发布时间:2022-04-27 11:21

我来回答

2个回答

热心网友 时间:2022-04-11 15:16

乐观锁/悲观锁

乐观锁与悲观锁不是指具体的什么类型的锁,而是指看待并发同步的角度。

悲观锁认为对于同一个数据的并发操作,一定是会发生修改的,哪怕没有修改,也会认为修改。因此对于同一个数据的并发操作,悲观锁采取加锁的形式。悲观的认为,不加锁的并发操作一定会出问题。
乐观锁则认为对于同一个数据的并发操作,是不会发生修改的。在更新数据的时候,会采用尝试更新,不断重新的方式更新数据。乐观的认为,不加锁的并发操作是没有事情的。
从上面的描述我们可以看出,悲观锁适合写操作非常多的场景,乐观锁适合读操作非常多的场景,不加锁会带来大量的性能提升。
公平锁/非公平锁

公平锁是指多个线程按照申请锁的顺序来获取锁。

非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。

优点:在于吞吐量比公平锁大。
缺点:可能会造成优先级反转或者某些线程饥饿现象(一直拿不到锁)。
对于Java ReentrantLock而言,通过构造函数指定该锁是否是公平锁,默认是非公平锁。
对于Synchronized而言,也是一种非公平锁。由于其并不像ReentrantLock是通过AQS的来实现线程调度,所以并没有任何办法使其变成公平锁。
可重入锁

可重入锁的概念是自己可以再次获取自己的内部锁。
举个例子,比如一条线程获得了某个对象的锁,此时这个对象锁还没有释放,当其再次想要获取这个对象的锁的时候还是可以获取的(如果不可重入的锁的话,此刻会造成死锁)。说的更高深一点可重入锁是一种递归无阻塞的同步机制。
对于Java ReentrantLock而言, 他的名字就可以看出是一个可重入锁,其名字是Re entrant Lock重新进入锁。
对于Synchronized而言,也是一个可重入锁。可重入锁的一个好处是可一定程度避免死锁。
独享锁/共享锁

独享锁是指该锁一次只能被一个线程所持有。
共享锁是指该锁可被多个线程所持有。
对于Java ReentrantLock(互斥锁)而言,其是独享锁。
但是对于Lock的另一个实现类ReadWriteLock(读写锁),其读锁是共享锁,其写锁是独享锁。读锁的共享锁可保证并发读是非常高效的,读写,写读 ,写写的过程是互斥的。
对于Synchronized而言,当然是独享锁。
分段锁

分段锁其实是一种锁的设计,并不是具体的一种锁。对于ConcurrentHashMap而言,其并发的实现就是通过分段锁的形式来实现高效的并发操作。

我们以ConcurrentHashMap来说一下分段锁的含义以及设计思想,ConcurrentHashMap中的分段锁称为Segment,它即类似于HashMap(JDK7与JDK8中HashMap的实现)的结构,即内部拥有一个Entry数组,数组中的每个元素又是一个链表;同时又是一个ReentrantLock(Segment继承了ReentrantLock)。
当需要put元素的时候,并不是对整个hashmap进行加锁,而是先通过hashcode来知道他要放在那一个分段中,然后对这个分段进行加锁,所以当多线程put的时候,只要不是放在一个分段中,就实现了真正的并行的插入。
但是,在统计size的时候,可就是获取hashmap全局信息的时候,就需要获取所有的分段锁才能统计。
分段锁的设计目的是细化锁的粒度,当操作不需要更新整个数组的时候,就仅仅针对数组中的一项进行加锁操作。
互斥锁:

无法获取琐时,进线程立刻放弃剩余的时间片并进入阻塞(或者说挂起)状态,同时保存寄存器和程序计数器的内容(保存现场,上下文切换的前半部分),当可以获取锁时,进线程激活,等待被调度进CPU并恢复现场(上下文切换下半部分)

上下文切换会带来数十微秒的开销,不要在性能敏感的地方用互斥锁
读写锁:

1)多个读者可以同时进行读
2)写者必须互斥(只允许一个写者写,也不能读者写者同时进行)
3)写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)
自旋锁:

自旋锁是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU。

热心网友 时间:2022-04-11 16:34

所有几种来说的话可能有点少三种啊,一般来说的话有手动的,有自动的等等。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
长期借款的会计分录到底怎么做啊,详细讲 高考作文可以查吗? 手机屏幕出现一条白色亮线 马铃薯和番茄嫁接能够做到上长番茄,地里长马铃薯吗? 马铃薯的根和番茄的茎可以嫁接吗 有没有上面能结番茄而下面能结马铃薯的植物吗? 美国公立高中申请条件是什么? 美国公立高中留学申请条件 2012年1月网签现不想继续在公司做了,学校在6月底办理毕业手续时我的派遣... 应届毕业生,现在网签了一单位a,但是毕业后不想去了,,,档案还没派遣... 如果信用卡欠1万元一年要付多少利息? 工商银行信用卡透支一万逾期五年还本金和利息多少 信用卡一万元逾期一个月利息多少? 花呗、信用卡里面借的钱到期还不上一万元钱一年多少利息? 一个月工行信用卡消费10000元,逾期未还款.利息和滞纳金是多少 1万块钱的信用卡逾期一年要多少利息? 信用卡逾期1万5一个月利息多少 种植碧根果广西可以种吗 碧根果是哪里出产的 碧根果是哪里出产的? 碧根果河南能种植吗? 自来水打开的水有很多漂浮在水上的白色物,能喝吗? 自来水乳白色能否立刻用于食用? 自来水放下来成白浑浊饮用对人体有害? 自来水流水以后是奶白色,一分钟之后就会变的清澈,可以食用吗? 自来水呈乳白色的汽水,等一下就没变清了,这是为什么呢?对人体安全吗 自来水里有气泡,呈乳白色这样的水可以正常饮用吗 我家农村的自来水管接水时刚开始的水是乳白色一会就变清了,是地下水,这样的水能吃吗? 自来水呈现乳白色的,物业称是漂白粉过量,请问这对人体有害吗? 自来水管里的水是乳白色的,能喝么 在java中有哪些锁 java线程锁有几种 JAVA的琐是什么?有几种锁?几种锁的区别又是什么? Java当中有哪几种锁 java对象锁与类锁区别 java的锁机制,到底都能锁住啥 论语九则原文及翻译 黄山山下如何选择住宿 详细�0�3 去黄山玩,去哪里住合适? 自驾去黄山第一站应该在哪落脚,在哪住宿和停车比较方便,还有就是方便第二天上山 黄山旅游攻略自驾游 自驾游去黄山,怎么预定宾馆 黄山4日游求攻略 周五想带女票去黄山游玩,从合肥出发! 急需出发路线,和景点游玩路线!望大家推荐住宿好的地方,和行程 无锡去黄山风景区路自驾路线,停车,吃住,游玩的实惠旅游具体说明 广西生育保险报销范围和标准 广西生育津贴领取条件 新农保生育报销广西 广西生育可以报销医保 江门的社保卡在广西生孩子怎么报销