我们使用的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();//解锁

  

最新文章

  1. 关于Android避免按钮重复点击事件
  2. java多线程解读二(内存篇)
  3. Java中json的构造和解析
  4. android获取textview的行数
  5. 第 28 章 CSS3 多列布局
  6. POJ 3468 A Simple Problem with Integers (线段树)
  7. Android优化——UI优化(二) 使用include标签复用布局
  8. 第一节:Maven 下载,安装和配置
  9. python中文字符串前加u
  10. KVO详解
  11. OSGI学习总结
  12. hash数组快速查找一个字符串中出现最多的字符,并统计出现的次数
  13. android LogConfigurator
  14. learnVUE-note
  15. C++ 二维数组作为形参传递使用实例
  16. Android GreenDao 在组件化项目中的一个问题 - 2018年7月5日21:15:14
  17. web.xml简介
  18. go语言之进阶篇方法的继承
  19. 008-插件方式启动web服务tomcat,jetty
  20. 快速排序——PowerShell版

热门文章

  1. js form 表单使用
  2. learning svn diff --summarize
  3. 使用vault pki engine 方便的管理证书
  4. graphql-query-rewriter 无缝处理graphql 变更
  5. C# 读取Excel 单元格是日期格式
  6. linux命令之------快捷键说明
  7. springMvc 入门二
  8. Edusoho之Basic Authentication
  9. MySql 三大知识点——索引、锁、事
  10. solr 使用