Java锁的种类以及辨析(四):可重入锁
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锁的种类以及辨析(四):可重入锁相关推荐
- java中的账户冻结原理_java可重入锁(ReentrantLock)的实现原理
前言 相信学过java的人都知道 synchronized 这个关键词,也知道它用于控制多线程对并发资源的安全访问,兴许,你还用过Lock相关的功能,但你可能从来没有想过java中的锁底层的机制是怎么 ...
- 【java】动态高并发时为什么推荐重入锁而不是Synchronized?
1.概述 转载:http://www.dreamwu.com/post-1758.html 这个图画的不错,有助于加深理解. [Java]Synchronized 有几种用法 [java] 从hots ...
- java读写锁死锁例子_Java并发关于重入锁与读写锁的详解
这篇文章主要介绍了Java并发编程之重入锁与读写锁,文中相关实例代码详细,测试可用,具有一定参考价值,需要的朋友可以了解下. 重入锁 重入锁,顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对 ...
- Java高并发编程(六):重入锁
重入锁定义:重入锁ReentrantLock,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁.除此之外,该锁的还支持获取锁时的公平和非公平性选择. ReentrantLock虽然没能像 ...
- 6※、线程同步、同步锁、同步代码块的使用、同步锁释放的时机、ReentrantLock可重入锁、公平锁与非公平锁的区别、什么是死锁、线程间的通信(生产者和消费者模式)
线程锁 1.※线程的同步:(要确保对象锁是一致的) 1.未使用同步锁的抢票 2.使用了同步锁的抢票 3.线程-同步代码块的使用 4.同步方法和代码块的区别 5.同步锁释放的时机 练习:多线程生产手机 ...
- python锁有哪几种_python 可重入锁有什么用?
可重入锁:支持在同一线程中多次请求同一资源 import threading import time class MyThread(threading.Thread): def run(self): ...
- 聊聊高并发(二十七)解析java.util.concurrent各个组件(九) 理解ReentrantLock可重入锁
这篇讲讲ReentrantLock可重入锁,JUC里提供的可重入锁是基于AQS实现的阻塞式可重入锁.这篇 聊聊高并发(十六)实现一个简单的可重入锁 模拟了可重入锁的实现.可重入锁的特点是: 1. 是互 ...
- Java成神之路——重入锁、公平非公平锁、自旋锁、读写锁
你知道的Java锁有哪些? synchronized?Lock?它们又有什么区别?锁可分为哪些种类?锁是如何实现的? 公平与非公平锁 公平锁与非公平锁的区别体现在锁造成阻塞时的排队机制,公平锁按申请锁 ...
- java代码如何避免死锁,Java可重入锁如何避免死锁
看到一个问题,Java的可重入锁为什么可以防止死锁呢?网上看了看资料,虽然有答案说出了正确答案,但是分析的不够详细,对初学者不够友好.这里我再做一个更清晰的分析. 首先是示例代码: 1 public ...
- 【Java 并发编程】多线程、线程同步、死锁、线程间通信(生产者消费者模型)、可重入锁、线程池
并发编程(Concurrent Programming) 进程(Process).线程(Thread).线程的串行 多线程 多线程的原理 多线程的优缺点 Java并发编程 默认线程 开启新线程 `Ru ...
最新文章
- memcached python客户端编写实践
- jQuery 基础总结
- 剑指Offer(书):链表的倒数第K个节点
- 接口应用练习题(用接口的方式实现某网上商城的网上支付功能)
- mkdir-yum-tree命令应用案例
- java servlet ajax_javaweb中ajax请求后台servlet(实例)
- 小程序毕设作品之微信小程序点餐系统毕业设计(5)任务书
- 学校能效管理系统解决方案-校园能源管理之智慧消防(安科瑞-须静燕)
- window双开微信
- 未来富豪,将出自这12大颠覆性领域
- macOS 升级12.6后 Electron 应用闪退
- 2021年浙大考研计算机专业录取分数线,浙江大学2021年计算机考研拟录取数据分析...
- #SATA# SATA 实际管脚接线图
- 《Java程序设计》第三周学习总结
- 输出复杂的菱形(续)
- 模拟退火的一些个人见解
- 微波战术通信系统空域抗干扰方法综述
- 1044 Shopping in Mars(二分法)
- [附源码]Python计算机毕业设计电子病历系统
- Spring Cloud一些组件原理(一)
热门文章
- Linux文件系统与持久性内存介绍
- java实现阿里云OSS上传下载
- Microsoft Project
- GPG对称加密与非对称加密
- IntelliJ idea中集成多个git项目模块
- 汇兑损益中间科目,系统情况
- inter uhd graphics630显卡驱动_显卡检测工具 GPUZ v2.35.0 简体中文汉化版
- 2019 年 Q1 全球云基础设施市场份额揭晓,AWS继续领跑市场;Mesos官方回应Twitter“抛弃”Mesos……...
- InCallContrller内部逻辑
- java ktv喝酒游戏