码农小汪-ReentrantLock 可重入锁
来源:互联网 发布:桃花源记元神效果数据 编辑:程序博客网 时间:2024/05/16 18:34
ReentrantLock,可重入的互斥锁,是一种递归无阻塞的同步机制。它可以等同于synchronized的使用,但是ReentrantLock提供了比synchronized更强大、灵活的锁机制,可以减少死锁发生的概率。
对于ReentrantLock,官方有详细的说明:一个可重入的互斥锁定 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁定相同的一些基本行为和语义,但功能更强大。ReentrantLock 将由最近成功获得锁定,并且还没有释放该锁定的线程所拥有。当锁定没有被另一个线程所拥有时,调用 lock 的线程将成功获取该锁定并返回。如果当前线程已经拥有该锁定,此方法将立即返回。可以使用 isHeldByCurrentThread() 和 getHoldCount() 方法来检查此情况是否发生。
ReentrantLock提供公平锁机制,构造方法接收一个可选的公平参数。当设置为true时,它是公平锁,这些所将访问权授予等待时间最长的线程。否则该锁将无法保证线程获取锁的访问顺序。但是公平锁与非公平锁相比,公平锁的程序在许多线程访问时表现为很低的总体吞吐量。
/** * Creates an instance of {@code ReentrantLock}. * This is equivalent to using {@code ReentrantLock(false)}. */ public ReentrantLock() { sync = new NonfairSync(); } /** * Creates an instance of {@code ReentrantLock} with the * given fairness policy. * * @param fair {@code true} if this lock should use a fair ordering policy */ public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); }
这里面写的几多复杂的!
我们来个简单的实例就行,我把刚刚自己实现的lock换成了他来使用
package ThredDemo;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * * @author JetWang * */public class ThreadLock { private int count = 0; Lock l = new ReentrantLock(); public void test() { // TODO Auto-generated method stub try { l.lock(); for (int i = 0; i < 5; i++) { count++; System.out.println(Thread.currentThread().getName() + "count:" + count); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { l.unlock(); } } public static void main(String[] args) { ThreadLock testLock = new ThreadLock(); for (int i = 0; i < 3; i++) { new Thread(new Runnable() { @Override public void run() { testLock.test(); } }).start(); } }}
Thread-0count:1Thread-0count:2Thread-0count:3Thread-0count:4Thread-0count:5Thread-1count:6Thread-1count:7Thread-1count:8Thread-1count:9Thread-1count:10Thread-2count:11Thread-2count:12Thread-2count:13Thread-2count:14Thread-2count:15
ReentrantLock与synchronized的区别
我么有看懂,慢慢的学习吧~
前面提到ReentrantLock提供了比synchronized更加灵活和强大的锁机制,那么它的灵活和强大之处在哪里呢?他们之间又有什么相异之处呢?
首先他们肯定具有相同的功能和内存语义。
1、与synchronized相比,ReentrantLock提供了更多,更加全面的功能,具备更强的扩展性。例如:时间锁等候,可中断锁等候,锁投票。
2、ReentrantLock还提供了条件Condition,对线程的等待、唤醒操作更加详细和灵活,所以在多个条件变量和高度竞争锁的地方,ReentrantLock更加适合(以后会阐述Condition)。
3、ReentrantLock提供了可轮询的锁请求。它会尝试着去获取锁,如果成功则继续,否则可以等到下次运行时处理,而synchronized则一旦进入锁请求要么成功要么阻塞,所以相比synchronized而言,ReentrantLock会不容易产生死锁些。
4、ReentrantLock支持更加灵活的同步代码块,但是使用synchronized时,只能在同一个synchronized块结构中获取和释放。注:ReentrantLock的锁释放一定要在finally中处理,否则可能会产生严重的后果。
5、ReentrantLock支持中断处理,且性能较synchronized会好些。
- 码农小汪-ReentrantLock 可重入锁
- 可重入锁 ReentrantLock
- ReentrantLock可重入锁
- ReentrantLock可重入锁
- ReentrantLock(可重入锁)
- 可重入锁 ReentrantLock
- ReentrantLock可重入锁
- 可重入锁 -- ReentrantLock
- ReentrantLock可重入锁
- java可重入锁ReentrantLock原理
- 可重入锁(ReentrantLock)
- 可重入锁ReentrantLock初探
- ReentrantLock可重入锁简介
- 码农小汪-ReentrantLock-lock方法
- 码农小汪-ReentrantLock-unlock
- ReentrantLock
- ReentrantLock
- ReentrantLock
- 练习10:那是什么鬼= =、
- WPF自定义命令
- Swift里封装AFNetworking
- 扣丁学堂笔记第19天Volley、android-async-http、ksoap2与WebView组件
- iOS 开发者帐号的申请流程。
- 码农小汪-ReentrantLock 可重入锁
- javascript 闭包理解
- 《C++ Primer》 第四版 第7章 函数
- Android 各种图片转黑白图和抖动算法的黑白图
- Android GridLayout 的 columnSpan和rowSpan问题
- EditText的焦点问题
- 第五周项目4-长方柱类
- String字符串比较equals遇到的坑
- 线性筛法找质数 —正确性,无重复性证明