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

  

40 多线程(十二)——ReentrantLock 可重入锁的更多相关文章

  1. JUC 一 ReentrantLock 可重入锁

    java.util.concurrent.locks ReentrantLock即可重入锁,实现了Lock和Serializable接口 ReentrantLock和synchronized都是可重入 ...

  2. ReenTrantLock可重入锁(和synchronized的区别)总结

    ReenTrantLock可重入锁(和synchronized的区别)总结 可重入性: 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也 ...

  3. ReentrantLock可重入锁的理解和源码简单分析

    import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantLock; /** * @author ...

  4. ReenTrantLock可重入锁和synchronized的区别

    ReenTrantLock可重入锁和synchronized的区别 可重入性: 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入 ...

  5. ReentrantLock——可重入锁的实现原理

    一. 概述 本文首先介绍Lock接口.ReentrantLock的类层次结构以及锁功能模板类AbstractQueuedSynchronizer的简单原理,然后通过分析ReentrantLock的lo ...

  6. ReentrantLock可重入锁——源码详解

    开始这篇博客之前,博主默认大家都是看过AQS源码的~什么居然没看过猛戳下方 全网最详细的AbstractQueuedSynchronizer(AQS)源码剖析(一)AQS基础 全网最详细的Abstra ...

  7. java ReentrantLock可重入锁功能

    1.可重入锁是可以中断的,如果发生了死锁,可以中断程序 //如下程序出现死锁,不去kill jvm无法解决死锁 public class Uninterruptible { public static ...

  8. ReentrantLock可重入锁、公平锁非公平锁区别与实现原理

    ReentrantLock是lock接口的一个实现类,里面实现了可重入锁和公平锁非公平锁 ReentrantLock公平锁和不公平锁实现原理 公平锁会获取锁时会判断阻塞队列里是否有线程再等待,若有获取 ...

  9. J.U.C之ReentrantLock 可重入锁

    * A reentrant mutual exclusion {@link Lock} with the same basic * behavior and semantics as the impl ...

随机推荐

  1. 有效的minidump(一)

    简介 在过去的几年中,崩溃转储成为我们调试活动的一个重要部分.当我们的软件在客户的机器出现故障时,创建应用程序状态的快照并使用在开发人员机器上运行的传统调试器对其进行分析的可能性是非常宝贵的.第一代崩 ...

  2. 关于Windows系统里的事后调试

    我一直在想,应用程序抛出未处理的异常和附加到进程的调试器之间会发生什么.显然这些信息就在我眼皮底下,但我是瞎子.Windows调试器关于事后调试的文档包含了您想要知道的所有详细信息. 最常见的应用程序 ...

  3. bootstrap导航条组件

    一.导航条模板(官方文档) <nav class="navbar navbar-default"> <div class="container-flui ...

  4. 2017.10.1 国庆清北 D1T1 zhx的字符串题

    题目背景 2017国庆清北D1T1 题目描述 你是能看到第一题的 friends 呢. ——hja 何大爷对字符串十分有研究,于是天天出字符串题虐杀 zhx.何大爷今天为 字符串定义了新的权值计算方法 ...

  5. P2052 [NOI2011]道路修建——树形结构(水题,大佬勿进)

    P2052 [NOI2011]道路修建 这个题其实在dfs里面就可以把事干完的,(我一开始还拿出来求了一把)…… 一条边的贡献就是儿子的大小和n-siz[v]乘上边权: #include<cma ...

  6. mysql 分组条件筛选

    mysql> select * from table1; +----------+------------+-----+---------------------+ | name_new | t ...

  7. 【POJ2993】Emag eht htiw Em Pleh

    题目传送门 本题知识点:模拟(如果对国际象棋不熟悉的同学可以先百度一下) 本题跟POJ2996是逆过来的操作,如果做过[POJ2996]的同学就不会对题意不理解的了. (以下默认您已AC[POJ299 ...

  8. 大数据应用期末总评Hadoop综合大作业

    作业要求来源于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3339 1.将爬虫大作业产生的csv文件上传到HDFS 此次作业选取的 ...

  9. _blocking_errnos = {errno.EAGAIN, errno.EWOULDBLOCK} pip

    python2.6 get-pip.py 报错下面的错误_blocking_errnos = {errno.EAGAIN, errno.EWOULDBLOCK} pip解决方案:# 1, 从官方git ...

  10. SDN-based Network Management Solution

    SDN-based Network Management Solution 摘要: 在此项目中,我们开发了一种网络管理应用程序,以监视和控制由支持OpenFlow的交换机和支持SNMP的设备组成的企业 ...