Java 锁
2019-05-04 09:39:33来源:博客园 阅读 ()
关于Java 锁的知识整理与回顾(个人笔记):
锁有哪些,分别用来干嘛?
Java实现锁有两种方式,synchronized关键字和Lock
(1)Lock(可判断锁状态)
Lock是基于JDK层面实现。Lock的实现主要有ReentrantLock、ReadLock和WriteLock(引出锁分类:)
①乐观锁/悲观锁:
乐观锁认为读多写少,乐观的认为拿数据时,不会改数据,所以不会上锁,而在更新数据时才会判断有无数据更新。悲观锁悲观的认为,写多,拿数据时先设定数据被修改了,每次在读写数据时都会上锁。
②公平锁/非公平锁:
ReentrantLock在构造函数中提供是否公平锁的初始化方式(默认是非公平锁,就是说可以变成公平锁。即他和synchronized不同之处之一):
public ReentrantLock() { sync = new NonfairSync(); }
public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); }
非公平锁不按套路出牌,有可能造成“饥饿”现象,但是它的实际执行效率、吞吐量要高于公平锁。
③独享锁/共享锁
独享锁是指该锁一次只能被一个线程所持有 (ReentrantLock、 Synchronized),共享锁反之(ReadWriteLock)。
④互斥锁/读写锁(ReadWriteLock)
互斥锁/读写锁像是独享锁/共享锁的具体的实现。(从字面意思就解释很清楚了)
⑤可重入锁
指同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁(ReentrantLock和Synchronized)。可重入锁可一定程度避免死锁。
⑥自旋锁
自旋锁是指尝试获取锁的线程不会阻塞,而是采用循环的方式尝试获取锁。“采用循环的方式”说明要一直占用CPU资源,浪费啊。在判断持有锁的线程会在很短的时间释放锁,用它就划算了,不用上下文来回切换了。
⑦偏向锁/轻量级锁/重量级锁
这是jdk1.6中对Synchronized锁做的优化,对象头在不同锁状态下的标志位存储。
偏向锁:加锁/解锁开销少,适用于只有一个线程访问同步块场景;轻量级锁:竞争线程不会堵塞,追求响应速度时用它;重量级锁:线程竞争不使用自旋,不会消耗CPU,吞吐量大。(尽量先考虑使用轻量级锁)
(2)synchronized(不可判断锁状态):
synchronized基于JVM层面实现。synchronized可以把任意的非Null的对象当作琐,它是非公平锁(且无法变成公平锁)、独享的可重入的悲观锁。使用synchronized比较省事儿,但是它是一个重量级操作,需要调用操作系统相关接口,性能较低,锁开销可能较大。
同时,synchronized它在不断的被优化,在JDK1.5之后synchronized引入了偏向锁,轻量级锁和重量级锁,java 6有适应自旋、锁粗化、偏向锁等,之后还设置一堆标记位,减少获得锁和释放锁带来的性能消耗,锁开销小了,效率高了。
原文链接:https://www.cnblogs.com/1693977889zz/p/10800854.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash