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();
}
}

最新文章

  1. MPMoviePlayerController属性,方法,通知整理
  2. [Js/Jquery]jquery插件开发
  3. Sql Server数据的加密与解密
  4. SQL2008-删除时间字段重复的方法
  5. Nwjs从入门到精通 菜鸟实践笔记【1】
  6. 百度地图api之如何自定义标注图标
  7. C#基础知识总结(一)
  8. 博客第一篇 osi七层网络传输模型
  9. uva1673(后缀自动机)
  10. 延迟初始化Lazy
  11. LeetCode Permutations问题详解
  12. JS--理解call、apply和bind
  13. 【题解】 Luogu P4312 / SP4155 [COCI 2009] OTOCI / 极地旅行社
  14. 使用matlab和ISE 创建并仿真ROM IP核
  15. chmod用法
  16. Retrofit2完全教程
  17. 纯干货,Spring-data-jpa详解(转)
  18. 随手记录一下 Vue 下来框搜索 select2 封装成vue
  19. bioperl 自动化下载genbank 中的序列
  20. python 查找字符串中字母的个数

热门文章

  1. HashMap,LinkedHashMap,TreeMap的有序性
  2. js-10s倒计时后关闭窗口
  3. 百度之星 初赛三 最短路 2 Dijkstra
  4. [HG]Market 题解
  5. Python黑科技:赋值技巧
  6. python3基础: 元组tuple、 列表list、 字典dict、集合set。 迭代器、生成器
  7. Housewife Wind
  8. LocalDate/LocalDateTime与String的互相转换示例(附DateTimeFormatter详解)
  9. python3笔记十八:python列表元组字典集合文件操作
  10. webConfig的使用