Java锁机制ReentrantLock
2024-09-03 13:21:34
ReentrantLock 锁常用于保证程序的人为顺序执行。
写一个类模拟ReentrantLock类的功能
class MyLock{
private boolean lock = false;
private int holdCount = 0;
private Thread myThread = null; //当前占用锁的线程
public synchronized void lock(){ //线程同步,只允许一个线程来获取这把锁
Thread currThread = Thread.currentThread(); //当前访问线程
if(lock == true && currThread != myThread){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//给予锁
myThread = currThread;
lock = true;
holdCount ++;
}
public synchronized void unlock(){
Thread currThread = Thread.currentThread(); //当前访问线程
if(currThread == myThread && holdCount>0){
holdCount -- ;
if(holdCount == 0){
notifyAll();
lock = false;
myThread = null;
}
}
} public int getHoldCount() {
return holdCount;
}
}
当一个线程不能得到一把锁时就会产生等待,等到其他线程释放锁后其将被唤醒,然后拿到所继续运行。
public class Test {
public static void main(String[] args) {
MyLock myLock = new MyLock();
new Thread(new Runnable() {
@Override
public void run() {
myLock.lock();
System.out.println(Thread.currentThread().getName()+"得到锁:"+myLock.getHoldCount());
myLock.lock(); //可重入锁
System.out.println(Thread.currentThread().getName()+"重入成功:"+myLock.getHoldCount());
myLock.unlock();
System.out.println(Thread.currentThread().getName()+"释放锁:"+myLock.getHoldCount());
myLock.unlock();
System.out.println(Thread.currentThread().getName()+"释放锁:"+myLock.getHoldCount());
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
myLock.lock();
System.out.println(Thread.currentThread().getName()+"得到锁:"+myLock.getHoldCount());
myLock.unlock();
System.out.println(Thread.currentThread().getName()+"释放锁:"+myLock.getHoldCount());
}
}).start();
}
}
ReentrantLock的使用
public class LockTest {
ReentrantLock lock = new ReentrantLock();
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 {
LockTest lockTest = new LockTest();
lockTest.a();
}
}
最新文章
- MPMoviePlayerController属性,方法,通知整理
- [Js/Jquery]jquery插件开发
- Sql Server数据的加密与解密
- SQL2008-删除时间字段重复的方法
- Nwjs从入门到精通 菜鸟实践笔记【1】
- 百度地图api之如何自定义标注图标
- C#基础知识总结(一)
- 博客第一篇 osi七层网络传输模型
- uva1673(后缀自动机)
- 延迟初始化Lazy
- LeetCode Permutations问题详解
- JS--理解call、apply和bind
- 【题解】 Luogu P4312 / SP4155 [COCI 2009] OTOCI / 极地旅行社
- 使用matlab和ISE 创建并仿真ROM IP核
- chmod用法
- Retrofit2完全教程
- 纯干货,Spring-data-jpa详解(转)
- 随手记录一下 Vue 下来框搜索 select2 封装成vue
- bioperl 自动化下载genbank 中的序列
- python 查找字符串中字母的个数
热门文章
- HashMap,LinkedHashMap,TreeMap的有序性
- js-10s倒计时后关闭窗口
- 百度之星 初赛三 最短路 2 Dijkstra
- [HG]Market 题解
- Python黑科技:赋值技巧
- python3基础: 元组tuple、 列表list、 字典dict、集合set。 迭代器、生成器
- Housewife Wind
- LocalDate/LocalDateTime与String的互相转换示例(附DateTimeFormatter详解)
- python3笔记十八:python列表元组字典集合文件操作
- webConfig的使用