| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 深入显出一篇能懂Java锁机制,Synchronized和ReentrantLock -> 正文阅读 |
|
[Java知识库]深入显出一篇能懂Java锁机制,Synchronized和ReentrantLock |
目录 五、synchronized和ReentrantLock的区别? 本篇内容共 2303?字,5234字符,阅读需要 6分钟。? 在Java中,多线程并发的应用场景下,同步性和安全性在设计中尤为重要,这也是面试当中时常提及的问题。在项目中,如果有使用多线程的经历,通常会应用到Java中的锁来保证线程安全和数据的一致性。 到目前,Java中的锁机制可以说很全面且强大了。同步、共享、互斥等功能的实现,我们有了许多选择,包括实现共享对象访问的机制:synchronized和volatile,还有提供高级特性的ReentrantLock机制。 这篇文章就简单记录一下synchronized?和?ReentrantLock?的原理应用和区别,在以后的使用选择中有着更加明确的依据。 一、synchronized关键字特性sychronized关键字保证多个线程之间访问资源的同步性,被它修饰的方法或者代码块在任意时刻只能有一个线程执行。 synchronized关键字是原生语法层面的互斥,在JVM层面实现,是一种重量级锁,因为在互斥状态下,没有获取到锁的线程会被挂起阻塞,而挂起线程和恢复线程的操作都需要系统转入内核态中完成。 在JDK1.6官方对synchronized在JVM层面进行大量的优化,引入了自旋锁、偏向锁、适应性自旋锁、锁消除、锁粗化、轻量级锁等技术来减少锁操作的开销。 另外,上面提到的使用synchronized修饰方法和代码块,主要有三种情况:
二、synchronized应用:双重校验锁实现单例模式以下实现的单例模式是线程安全的,使用synchronized关键字将类对象加锁。
其中,volatile关键字是必要的,因为?JVM 具有指令重排的特性,执行顺序有可能变成 1->3->2。 在多线程的情况下,volatile关键字保证了可见性,禁止 JVM 的指令重排,保证在多线程环境下也能正常运行?。 三、显式锁:Lock和ReentrantLock1、Lock接口
?在JDK1.5,开始提供Lock接口,从上面的源码可以发现,与synchronized这种内部加锁机制不同,Lock提供了无条件、定时的、可轮询、可中断的锁操作,加锁和解锁的操作都是显式进行的。 2、ReentrantLockReentrantLock是JDK1.5提供的互斥锁API。它实现了Lock接口,提供了跟synchronized相同的互斥和内存可见。 ReentrantLock支持Lock接口定义的所有获取锁的模式,因此对于处理不可用的锁提供了更多的灵活性。ReentrantLock锁机制的本质跟内部锁十分相似,它的优势就体现在:
当然,使用ReentrantLock的时候,需要知道它的特性以及带来的问题。 上面说到,Lock的加锁和解锁都是显式操作,因此这种锁比内部锁更加复杂,锁必须在finally块中释放。另外,如果在加锁的代码块之外抛出了异常,锁将永远不会被释放。这些问题都是需要警惕的,出现错误很难找出程序的发生点。
四、锁的公平性ReentrantLock的构造函数中提供了两种锁的选择:非公平锁(默认)和公平锁。 部分源码如下:
?公平锁则是保证线程按照先来先服务的请求顺序,如果锁已经被其他线程占有,或者已经存在线程在等待锁了,新请求线程会加入等待队列;而非公平锁则是允许抢占的方式,线程只有在锁被占用时才会等待,一旦可以获得锁,不会让给等待队列中的其他线程。 在实际场景中,非公平锁的性能明显高于公平锁。 如上图所示,在测试中,基于ReentrantLock实现的HashMap,即ConcurrentHashMap,表现出的性能不错,而公平锁表现最差。 这是因为: 在竞争激烈的情况下,抢占机制可以使得线程获取资源的效率更高。非公平锁的合适使用场景持有锁的时间段,或者请求锁的平均时间间隔比较短。
?相反,对于持有锁时间长,请求锁平均时间间隔长的,公平锁就更有优势。 五、synchronized和ReentrantLock的区别学习到这里,我们已经初步了解synchronized关键字和ReentrantLock的原理和一些应用场景,在分析过程中也可以发现他们相似和相异之处,这里简单总结一下:
学习Java开发,多线程等知识,最近我也在跟着这一套 《Java 工程师学习成长知识图谱》进行体系的学习,是CSDN官方推出的,质量很不错! 其中包含了Java专业体系结构完整详细,推荐给大家学习使用,有兴趣可以扫码查看,最近我也在学习当中,当然,我的文章会记录学习,欢迎大家阅读,比如我的专栏《Java宝藏》、《Socket网络编程》。 展开就是这样的,尺寸870mm*560mm排版好看,内容很充实。推荐给有需要的伙伴,一起来学习Java! 如果觉得不错欢迎“一键三连”哦,点赞收藏关注,评论提问建议,欢迎交流学习!一起加油进步,我们下篇见!? 本篇内容首发我的CSDN博客:https://csdn-czh.blog.csdn.net/article/details/118438799 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/18 14:54:01- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |