请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

Java中15种锁的分类综合总结

[复制链接]
查看: 3|回复: 0

2万

主题

2万

帖子

6万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
65439
发表于 2019-12-9 20:09 | 显示全部楼层 |阅读模式
本人免费整理了Java高级材料,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并发散布式等教程,一共30G,需要自己支付。
传送门:https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q

在读很多并发文章中,会说起各类百般锁如公允锁,悲观锁等等,这篇文章先容各类锁的分类。先容的内容以下:
公允锁/非公允锁

可重入锁
独享锁/同享锁
互斥锁/读写锁
悲观锁/灰心锁
分段锁
偏向锁/轻量级锁/重量级锁
自旋锁
上面是很多锁的名词,这些分类并不是尽是指锁的状态,有的指锁的特征,有的指锁的筹划,下面总结的内容是对每个锁的名词举行必定的表白。
公允锁/非公允锁

公允锁是指多个线程依照申请锁的顺序来获得锁。
非公允锁是指多个线程获得锁的顺序并不是依照申请锁的顺序,有大要后申请的线程比先申请的线程优先获得锁。有大要,会形成优先级反转大概饥饿现象。
对于Java ReentrantLock而言,经过机关函数指定该锁能否是公允锁,默许黑白公允锁。非公允锁的优点在于吞吐量比公允锁大。
对于Synchronized而言,也是一种非公允锁。由于其并不像ReentrantLock是经过AQS的来实现线程调节,所以并没有任何法子使其酿成公允锁。
可重入锁

可重入锁别名递归锁,是指在同一个线程在外层方式获得锁的时候,在进入内层方式会自动获得锁。说的有点笼统,下面会有一个代码的示例。
对于Java ReentrantLock而言, 他的名字便可以看出是一个可重入锁,其名字是Re entrant Lock重新进入锁。
对于Synchronized而言,也是一个可重入锁。可重入锁的一个好处是可必定水平制止死锁。
synchronized void setA() throws Exception{ Thread.sleep(1000); setB(); } synchronized void setB() throws Exception{ Thread.sleep(1000); }
上面的代码就是一个可重入锁的一个特点,假如不是可重入锁的话,setB大要不会被当前方程履行,大要形成死锁。
独享锁/同享锁

独享锁是指该锁一次只能被一个线程所持有。
同享锁是指该锁可被多个线程所持有。
对于Java ReentrantLock而言,其是独享锁。可是对于Lock的另一个实现类ReadWriteLock,其读锁是同享锁,其写锁是独享锁。
读锁的同享锁可保证并发读黑白常高效的,读写,写读 ,写写的进程是互斥的。
独享锁与同享锁也是经过AQS来实现的,经过实现差此外方式,来实现独享大概同享。
对于Synchronized而言,固然是独享锁。
互斥锁/读写锁

上面讲的独享锁/同享锁就是一种广义的说法,互斥锁/读写锁就是具体的实现。
互斥锁在Java中的具体实现就是ReentrantLock
读写锁在Java中的具体实现就是ReadWriteLock
悲观锁/灰心锁

悲观锁与灰心锁不是指具体的什么典范的锁,而是指看待并发同步的角度。
灰心锁以为对于同一个数据的并发利用,必定是会发生点窜的,哪怕没有点窜,也会以为点窜。是以对于同一个数据的并发利用,灰心锁采取加锁的形式。灰心的以为,不加锁的并发利用必定会出题目。
悲观锁则以为对于同一个数据的并发利用,是不会发生点窜的。在更新数据的时候,会采用尝试更新,不停重新的方式更新数据。悲观的以为,不加锁的并发利用是没有事变的。
从上面的描摹我们可以看出,灰心锁适当写利用很是多的场景,悲观锁适当读利用很是多的场景,不加锁会带来大量的性能提升。
灰心锁在Java中的利用,就是利用各类锁。
悲观锁在Java中的利用,是无锁编程,经常采用的是CAS算法,典型的例子就是原子类,经过CAS自旋实现原子利用的更新。
分段锁

分段锁实在是一种锁的筹划,并不是具体的一种锁,对于ConcurrentHashMap而言,其并发的实现就是经过分段锁的形式来实现高效的并发利用。
我们以ConcurrentHashMap来说一下分段锁的寄义以及筹划脑筋,ConcurrentHashMap中的分段锁称为Segment,它即类似于HashMap(JDK7与JDK8中HashMap的实现)的结构,即内部具有一个Entry数组,数组中的每个元素又是一个链表;同时又是一个ReentrantLock(Segment继续了ReentrantLock)。
当需要put元素的时候,并不是对全部hashmap举行加锁,而是先经过hashcode来晓得他要放在那一个分段中,然后对这个分段举行加锁,所以当多线程put的时候,只要不是放在一个分段中,就实现了实在的并行的插入。
可是,在统计size的时候,可就是获得hashmap全局信息的时候,就需要获得全数的分段锁才华统计。
分段锁的筹划目标是细化锁的粒度,当利用不需要更新全部数组的时候,就仅仅针对数组中的一项举行加锁利用。
偏向锁/轻量级锁/重量级锁

这三种锁是指锁的状态,而且是针对Synchronized。在Java 5经过引入锁升级的机制来实现高效Synchronized。这三种锁的状态是经过工具监视器在工具头中的字段来表白的。
偏向锁是指一段同步代码不停被一个线程所拜候,那末该线程会自动获得锁。下降获得锁的价格。
轻量级锁是指当锁是偏向锁的时候,被另一个线程所拜候,偏向锁就会升级为轻量级锁,其他线程会经过自旋的形式尝试获得锁,不会阻塞,进步性能。
重量级锁是指当锁为轻量级锁的时候,另一个线程固然是自旋,但自旋不会不停持续下去,当自旋必定次数的时候,还没有获得到锁,就会进入阻塞,该锁收缩为重量级锁。重量级锁会让其他申请的线程进入阻塞,性能下降。
自旋锁

在Java中,自旋锁是指尝试获得锁的线程不会立即阻塞,而是采用循环的方式去尝试获得锁,这样的好处是淘汰线程高低文切换的消耗,弱点是循环会消耗CPU。

免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 淄博新闻网-淄博日报 淄博晚报 淄博财经新报 掌中淄博 淄博专业新闻资讯发布网站 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表