Java锁机制ReentrantLock
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();
}
}
Java锁机制ReentrantLock的更多相关文章
- 转 : 深入解析Java锁机制
深入解析Java锁机制 https://mp.weixin.qq.com/s?__biz=MzU0OTE4MzYzMw%3D%3D&mid=2247485524&idx=1&s ...
- Java 锁机制总结
锁的种类 独享锁 VS 共享锁 独享锁:锁只能被一个线程持有(synchronized) 共享锁:锁可以被多个程序所持有(读写锁) 乐观锁 VS 悲观锁 乐观锁:每次去拿数据的时候都乐观地认为别人不会 ...
- java锁机制的面试题
java锁机制的面试题 1.ABA问题 2.CAS乐观锁 3.synchronize实现原理 4.synchronize与lock的区别 5.volatile实现原理 6.乐观锁的业务场景及实现方式 ...
- Java锁机制深入理解
Java锁机制 背景知识 指令流水线 CPU的基本工作是执行存储的指令序列,即程序.程序的执行过程实际上是不断地取出指令.分析指令.执行指令的过程. 几乎所有的冯•诺伊曼型计算机的CPU,其工 ...
- java锁机制
2.4 锁机制 临界区是指,使用同一个锁控制的同一段代码区或多段代码区之间,在同一时间内最多只能有一个线程在执行操作.这个概念与传统的临界区有略微的差别,这里不想强调这些概念上的差别,临 ...
- JAVA锁机制-可重入锁,可中断锁,公平锁,读写锁,自旋锁,
如果需要查看具体的synchronized和lock的实现原理,请参考:解决多线程安全问题-无非两个方法synchronized和lock 具体原理(百度) 在并发编程中,经常遇到多个线程访问同一个 ...
- java 锁机制(synchronized 与 Lock)
在java中,解决同步问题,很多时候都会使用到synchronized和Lock,这两者都是在多线程并发时候常使用的锁机制. synchronized是java中的一个关键字,也就是说是java内置的 ...
- 【面试专栏】JAVA锁机制
1. 悲观锁 / 乐观锁 在Java和数据库中都存在悲观锁和乐观锁的应用.Mysql锁机制中的悲观锁和乐观锁请查看: Mysql锁机制--悲观锁和乐观锁 悲观锁:在获得数据时先加锁,只到数 ...
- Java锁机制了解一下
前言 回顾前面: 多线程三分钟就可以入个门了! Thread源码剖析 多线程基础必要知识点!看了学习多线程事半功倍 只有光头才能变强! 本文章主要讲的是Java多线程加锁机制,有两种: Synchro ...
随机推荐
- 根据IP 自动识别国家和城市
https://www.jianshu.com/p/1b1a018ae729 根据IP 自动识别国家和城市
- 【CF1181D】Irrigation
题目大意:给定 M 个城市,每年会选出一个城市举办比赛,现给出前 N 年城市举办比赛的情况.在接下来的年份中,每年会在举办比赛次数最小的城市举办比赛,如果有很多城市举办次数均为最小值,则在编号最小的城 ...
- maven在eclipse运行命令和calss文件没有更新的问题
使用Eclipse Maven插件[Run As]-[Maven build]时并未为其指定goal或phase 解决方法: 1.使用Eclipse Maven插件[Run As]-[Maven b ...
- C# 扩展、常用方法
项目基本做完了,抽空整理下里面用到的扩展方法,以及复用度很高的代码,省的以后到处去找. 一.C#扩展方法——Distinct去重 二.C#扩展方法——获得枚举Description 三.C#扩展方法— ...
- react 引入swiper
npm install --save swiper 应用模块引入 import 'swiper/dist/css/swiper.min.css' import Swiper from 'swiper'
- 51 Nod 1486 大大走格子
1486 大大走格子 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 收藏 关注 有一个h行w列的棋盘,里面有一些格子是不 ...
- [CF1223G/1240E]Wooden Raft 题解
前言 上午一场模拟赛(发布前很久,因为这题题解太长了),发现T3特别珂怕,打开题解,发现一行字: 不要再问了,再问就是CF 1240E 当场去世.jpg. 在下文中,我们记 \(A\) 为 \(a\) ...
- OCWA提高组模拟赛一 Solution
Problem A RecMin 给出一个$n \times m$的矩阵,其中$1 \leq n,m \leq 3\ times 10^3$ 给出整数$a,b$,求出在矩阵中所有$a\ times b ...
- 使用oracle删除表中重复记录
(1)使用用rowid方法 查询重复数据:select * from person a where rowid !=(select max(rowid) from person b where a.c ...
- hibernarte主键生成机制
1. 主键(id)生成策略 1) assigned 主键由外部程序负责生成,在 save() 之前指定. 2) hilo 通过hi/lo 算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源 ...