| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> ReentrantLock和synchronized的区别 -> 正文阅读 |
|
[Java知识库]ReentrantLock和synchronized的区别 |
Java 5为了增强内置锁的功能,引入了可重入锁(ReentrantLock)。在此以前“synchronized”和“volatile”是实现并发的方式。 Synchronized关键字使用内置锁(intrinsic lock)或者称做监视锁(monitor lock)。每个Java对象都有一个内置锁与之相关联。不管何时,当一个线程尝试去访问一个synchronized代码块或者synchronized方法的时候,线程都须要首先获取到对象关联的内置锁。对于static方法,线程获取的是类对象的内置锁。 内置锁机制使得代码的书写很是整洁,而且大部分场合下功能也够用。因此为何咱们须要额外的去显式的建立锁?让咱们讨论一下。 内置锁机制在功能上有一些限制:性能
除此以外,ReentrantLock还支持对锁的测试,支持既能够被中断又能够设置超时。ReentrantLock还能够设置公平原则,容许更灵活的线程调度。 让咱们看一下实现了Lock类的ReentrantLock类中的部分方法:线程 ? 让咱们理解一下如何使用上面的分析结果,看看咱们会获得什么好处。 ? 轮询和设置了超时的对锁的获取 让咱们看一段代码的例子:对象 ? 在上面的方法中,当两个线程A和B几乎在同时转帐(transfer money)的时候有可能会发生死锁。blog ? 有可能线程A已经获取了acc1对象的锁而且正在等待获取acc2对象的锁,与此同时,线程B已经获取了acc2对象的锁而且正在等待获取acc1的锁。这将会致使死锁,程序不得不须要重启!! 然而有一个方法能够避免这种状况:就是所谓的按相同的顺序获取锁。我我的以为这个实现起来比较困难。 一个更简便的实现方式是用ReentrantLock的tryLock()方法。这种方法称为“轮询式可超时的锁获取”。即使你不可以获取全部必须的锁,它也可使你从新得到对程序的控制,释放部分已经获取的锁,而后从新尝试。 所以,咱们将会使用trylock()来获取两个锁,若是咱们不能获取到两个锁,能够释放已经获取到的一个,而后重试。 ? 这里咱们实现了一个支持超时的加锁机制,因此,若是锁在指定的时间段内不能被获取到,方法将会返回失败(false),优雅的退出。 ? 获取锁能够被中断 获取锁能够被中断使得锁可使用在能够取消的操做上。 lockInterruptibly()方法使得咱们能够尝试去获取锁可是保留线程能够被中断的能力。基本的意思是这个方法使得线程能够当即响应从其它线程发过来的中断信号。这在当咱们想要发送中断信号到全部等待锁的线程时会颇有用。 让咱们看一个例子,假设咱们有一个共享的方法来发送消息,但愿若是有其余的线程请求中断,那么正在发送的线程应当释放锁而且退出或者中止正在进行的操做以取消当前的任务。 ? 带超时的tryLock(long time, TimeUnit unit)方法也是能够响应中断的。 ? 非代码块加锁 内置锁的获取和释放是以代码块的结构出现的,即锁老是在被获取的同一个代码块被释放,无论程序逻辑如何。 外置锁提供了更加显式的控制。在一些哈希容器和链表中使用到了外置锁。 ? 公平性 ReentrantLock的构造方法能够设置是否使用公平原则:建立一个公平锁或者非公平锁。使用公平锁的线程们将会以他们请求获取锁的顺序获得锁,而非公平锁容许线程不按请求顺序获取锁,这称做“闯入”(当锁空闲时,打破队列顺序去获取锁)。 公平锁由于会涉及到线程的挂起和恢复因此有很大的性能方面的代价。可能会有如下的状况:从一个挂起的线程被恢复到它开始实际执行会有严重的延时。让咱们看一个情形: A -> 持有锁 B -> 请求锁,等待A释放锁,而后进入了挂起状态 C -> 请求锁,同时A释放了锁,此时C并无进入挂起状态 因为C并无处于挂起状态,因此它是有机会先去获取A释放的锁,完成工做,而后甚至在线程B被唤醒以前就释放锁的。所以,这种情形下,非公平锁具备很是大的性能上的优点。 ? 结篇 内置锁和外置锁的内部实现机制是同样的,因此性能的提高是主观上的。它依赖于咱们上面讨论的具体状况。外置锁提供了对死锁,线程饥饿等问题的显示的处理方式。 ? 英文原文: https://www.javacodegeeks.com/2013/11/what-are-reentrant-locks.html |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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年11日历 | -2024/11/24 11:08:44- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |