40 多线程(十二)——ReentrantLock 可重入锁
2024-08-30 00:01:42
我们使用的synchronized加的锁是可以延续使用的,如下:
public void test() {
//第一次获得锁
synchronized(this) {
while(true) {
//第二次获得同样的锁
synchronized(this) {
System.out.println("ReentrantLock");
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
使用synchronized加的锁必须等到线程结束才会被释放,这可能会造成死锁。
而相对synchronized,ReentrantLock锁更灵活,它可以指定加锁一段时间后主动释放锁等更为强大的功能,目前仅做了解即可。
详细内容自行百度。接下来仿写ReentrantLock源码,实现基本的lock与unLock方法。
package _20191209;
/**
* 可重入锁演示:锁不以延续使用
* @author TEDU
*
*/
public class LockTest03 {
ReLock lock = new ReLock();
public void a() throws InterruptedException {
lock.lock();
System.out.println(lock.getHoldCount());
doSomething();//需要被加锁的部分
lock.unlock();
System.out.println(lock.getHoldCount());
} public void doSomething() throws InterruptedException {
lock.lock();
System.out.println(lock.getHoldCount());
//。。。。。。
lock.unlock();
System.out.println(lock.getHoldCount());
} public static void main(String[] args) throws InterruptedException {
LockTest03 test = new LockTest03();
test.a();
} }
//可重入锁
class ReLock{
//是否被占用
private boolean isLocked = false;
//存储线程的变量
private Thread lockedBy = null;
//锁计数器:锁使用次数
private int holdCount = 0;
//使用锁
public synchronized void lock() throws InterruptedException{
Thread t = Thread.currentThread();
while(isLocked && lockedBy != t) {
wait();
} isLocked = true;
lockedBy = t;
holdCount ++;
}
//释放锁
public synchronized void unlock() {
if(Thread.currentThread() == lockedBy) {
holdCount --;
if(holdCount == 0) {
isLocked = false;
notify();
lockedBy = null;
}
}
}
public int getHoldCount() {
return holdCount;
}
}
如果需要使用ReentrantLock只需要new一个就行了:
ReentrantLock relock = new ReentrantLock();
relock.lock();//加锁
relock.unlock();//解锁
最新文章
- 关于Android避免按钮重复点击事件
- java多线程解读二(内存篇)
- Java中json的构造和解析
- android获取textview的行数
- 第 28 章 CSS3 多列布局
- POJ 3468 A Simple Problem with Integers (线段树)
- Android优化——UI优化(二) 使用include标签复用布局
- 第一节:Maven 下载,安装和配置
- python中文字符串前加u
- KVO详解
- OSGI学习总结
- hash数组快速查找一个字符串中出现最多的字符,并统计出现的次数
- android LogConfigurator
- learnVUE-note
- C++ 二维数组作为形参传递使用实例
- Android GreenDao 在组件化项目中的一个问题 - 2018年7月5日21:15:14
- web.xml简介
- go语言之进阶篇方法的继承
- 008-插件方式启动web服务tomcat,jetty
- 快速排序——PowerShell版