Java锁的种类以及辨析(四):可重入锁

本文里面讲的是广义上的可重入锁,而不是单指JAVA下的ReentrantLock。

可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。
在JAVA环境下 ReentrantLock 和synchronized 都是 可重入锁

下面是使用实例

public class Test implements Runnable{public synchronized void get(){System.out.println(Thread.currentThread().getId());set();}public synchronized void set(){System.out.println(Thread.currentThread().getId());}@Overridepublic void run() {get();}public static void main(String[] args) {Test ss=new Test();new Thread(ss).start();new Thread(ss).start();new Thread(ss).start();}
}
public class Test implements Runnable {ReentrantLock lock = new ReentrantLock();public void get() {lock.lock();System.out.println(Thread.currentThread().getId());set();lock.unlock();}public void set() {lock.lock();System.out.println(Thread.currentThread().getId());lock.unlock();}@Overridepublic void run() {get();}public static void main(String[] args) {Test ss = new Test();new Thread(ss).start();new Thread(ss).start();new Thread(ss).start();}
}
两个例子最后的结果都是正确的,即 同一个线程id被连续输出两次。结果如下:Threadid: 8
Threadid: 8
Threadid: 10
Threadid: 10
Threadid: 9
Threadid: 9

可重入锁最大的作用是避免死锁
我们以自旋锁作为例子,

public class SpinLock {private AtomicReference<Thread> owner =new AtomicReference<>();public void lock(){Thread current = Thread.currentThread();while(!owner.compareAndSet(null, current)){}}public void unlock (){Thread current = Thread.currentThread();owner.compareAndSet(current, null);}
}

对于自旋锁来说,
1、若有同一线程两调用lock() ,会导致第二次调用lock位置进行自旋,产生了死锁
说明这个锁并不是可重入的。(在lock函数内,应验证线程是否为已经获得锁的线程)
2、若1问题已经解决,当unlock()第一次调用时,就已经将锁释放了。实际上不应释放锁。
(采用计数次进行统计)
修改之后,如下:

public class SpinLock1 {private AtomicReference<Thread> owner =new AtomicReference<>();private int count =0;public void lock(){Thread current = Thread.currentThread();if(current==owner.get()) {count++;return ;}while(!owner.compareAndSet(null, current)){}}public void unlock (){Thread current = Thread.currentThread();if(current==owner.get()){if(count!=0){count--;}else{owner.compareAndSet(current, null);}}}
}

该自旋锁即为可重入锁。

Java锁的种类以及辨析(四):可重入锁相关推荐

  1. java中的账户冻结原理_java可重入锁(ReentrantLock)的实现原理

    前言 相信学过java的人都知道 synchronized 这个关键词,也知道它用于控制多线程对并发资源的安全访问,兴许,你还用过Lock相关的功能,但你可能从来没有想过java中的锁底层的机制是怎么 ...

  2. 【java】动态高并发时为什么推荐重入锁而不是Synchronized?

    1.概述 转载:http://www.dreamwu.com/post-1758.html 这个图画的不错,有助于加深理解. [Java]Synchronized 有几种用法 [java] 从hots ...

  3. java读写锁死锁例子_Java并发关于重入锁与读写锁的详解

    这篇文章主要介绍了Java并发编程之重入锁与读写锁,文中相关实例代码详细,测试可用,具有一定参考价值,需要的朋友可以了解下. 重入锁 重入锁,顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对 ...

  4. Java高并发编程(六):重入锁

    重入锁定义:重入锁ReentrantLock,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁.除此之外,该锁的还支持获取锁时的公平和非公平性选择. ReentrantLock虽然没能像 ...

  5. 6※、线程同步、同步锁、同步代码块的使用、同步锁释放的时机、ReentrantLock可重入锁、公平锁与非公平锁的区别、什么是死锁、线程间的通信(生产者和消费者模式)

    线程锁 1.※线程的同步:(要确保对象锁是一致的) 1.未使用同步锁的抢票 2.使用了同步锁的抢票 3.线程-同步代码块的使用 4.同步方法和代码块的区别 5.同步锁释放的时机 练习:多线程生产手机 ...

  6. python锁有哪几种_python 可重入锁有什么用?

    可重入锁:支持在同一线程中多次请求同一资源 import threading import time class MyThread(threading.Thread): def run(self): ...

  7. 聊聊高并发(二十七)解析java.util.concurrent各个组件(九) 理解ReentrantLock可重入锁

    这篇讲讲ReentrantLock可重入锁,JUC里提供的可重入锁是基于AQS实现的阻塞式可重入锁.这篇 聊聊高并发(十六)实现一个简单的可重入锁 模拟了可重入锁的实现.可重入锁的特点是: 1. 是互 ...

  8. Java成神之路——重入锁、公平非公平锁、自旋锁、读写锁

    你知道的Java锁有哪些? synchronized?Lock?它们又有什么区别?锁可分为哪些种类?锁是如何实现的? 公平与非公平锁 公平锁与非公平锁的区别体现在锁造成阻塞时的排队机制,公平锁按申请锁 ...

  9. java代码如何避免死锁,Java可重入锁如何避免死锁

    看到一个问题,Java的可重入锁为什么可以防止死锁呢?网上看了看资料,虽然有答案说出了正确答案,但是分析的不够详细,对初学者不够友好.这里我再做一个更清晰的分析. 首先是示例代码: 1 public ...

  10. 【Java 并发编程】多线程、线程同步、死锁、线程间通信(生产者消费者模型)、可重入锁、线程池

    并发编程(Concurrent Programming) 进程(Process).线程(Thread).线程的串行 多线程 多线程的原理 多线程的优缺点 Java并发编程 默认线程 开启新线程 `Ru ...

最新文章

  1. memcached python客户端编写实践
  2. jQuery 基础总结
  3. 剑指Offer(书):链表的倒数第K个节点
  4. 接口应用练习题(用接口的方式实现某网上商城的网上支付功能)
  5. mkdir-yum-tree命令应用案例
  6. java servlet ajax_javaweb中ajax请求后台servlet(实例)
  7. 小程序毕设作品之微信小程序点餐系统毕业设计(5)任务书
  8. 学校能效管理系统解决方案-校园能源管理之智慧消防(安科瑞-须静燕)
  9. window双开微信
  10. 未来富豪,将出自这12大颠覆性领域
  11. macOS 升级12.6后 Electron 应用闪退
  12. 2021年浙大考研计算机专业录取分数线,浙江大学2021年计算机考研拟录取数据分析...
  13. #SATA# SATA 实际管脚接线图
  14. 《Java程序设计》第三周学习总结
  15. 输出复杂的菱形(续)
  16. 模拟退火的一些个人见解
  17. 微波战术通信系统空域抗干扰方法综述
  18. 1044 Shopping in Mars(二分法)
  19. [附源码]Python计算机毕业设计电子病历系统
  20. Spring Cloud一些组件原理(一)

热门文章

  1. Linux文件系统与持久性内存介绍
  2. java实现阿里云OSS上传下载
  3. Microsoft Project
  4. GPG对称加密与非对称加密
  5. IntelliJ idea中集成多个git项目模块
  6. 汇兑损益中间科目,系统情况
  7. inter uhd graphics630显卡驱动_显卡检测工具 GPUZ v2.35.0 简体中文汉化版
  8. 2019 年 Q1 全球云基础设施市场份额揭晓,AWS继续领跑市场;Mesos官方回应Twitter“抛弃”Mesos……...
  9. InCallContrller内部逻辑
  10. java ktv喝酒游戏