今天做了一个小实验,关于Reentrantlock ,不知道自己理解的对不对。
import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class LockTest { public void outer(){ System.out.println("this is outer "+Thread.currentThread().getName()); inter(); } public void inter(){ System.out.println("this is inter"+Thread.currentThread().getName()); } public static void main(String[] args) { LockTest test = new LockTest(); ReentrantLock lock = new ReentrantLock(); Condition con = lock.newCondition(); Thread test1 = new Thread(new RunTest1(test,lock,con),"task1"); Thread test2 = new Thread(new RunTest2(test,lock,con),"task2"); test1.start(); test2.start(); } } class RunTest1 implements Runnable{ private LockTest lTest; ReentrantLock lock ; Condition con; public RunTest1(LockTest lTest,ReentrantLock lock,Condition con ){ this.lock = lock; this.lTest = lTest; this.con = con; } @Override public void run() { //task1 上锁 lock.lock(); try { System.out.println("this is :"+Thread.currentThread().getName()); //然后直接让task1 进入等待,这时候并没有释放锁 con.await(5,TimeUnit.SECONDS); lTest.inter(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ lock.unlock(); } } } class RunTest2 implements Runnable{ private LockTest lTest; ReentrantLock lock ; Condition con; public RunTest2(LockTest lTest,ReentrantLock lock,Condition con){ this.lTest = lTest; this.lock = lock; this.con = con; } @Override public void run() { //得到锁 lock.lock(); System.out.println("this is :"+Thread.currentThread().getName()); //执行方法 task2 lTest.outer(); try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ //释放 这里如果不释放锁,则上面task1 await结束后也会等待锁释放而无法执行下面的方法 lock.unlock(); } } }
ReentrantLock 当Condition.await() 释放资源的时候,锁也会放掉,然后其他线程就可以获得锁然后执行任务,当await时间到了的时候就会再次去竞争锁。
this is :task1 this is :task2 this is outer task2 this is intertask2 this is intertask1
囧。。一天时间竟搞点没用的东西。。。
PS.哎 找不到工作呀。求大牛带学呀。。一个人自学太苦逼了。。。。
相关推荐
ReentrantLock java除了使用关键字synchronized外,还可以使用ReentrantLock实现独占锁的功能。而且ReentrantLock相比...3.synchronized不可响应中断,一个线程获取不到锁就一直等着;ReentrantLock可以相应中断。
java语言 并发编程 ReentrantLock与synchronized区别 详解
ReentrantLock的使用及注意事项
1、ReentrantLock简介 2、ReentrantLock函数列表 3、重入的实现 4、公平锁与非公平锁 5、ReentrantLock 扩展的功能 6
ReentrantLock源码剖析
Locks 框架提供了比传统的 synchronized 关键字更强大、更灵活的线程同步机制,而 ReentrantLock 是其中的一种重要实现。 Locks 框架概述: 简要介绍 Locks 框架,解释其在多线程编程中的作用和优势。比较 Locks ...
一张图将整个ReentrantLock流程看懂,干货满满 一张图将整个ReentrantLock流程看懂,干货满满 一张图将整个ReentrantLock流程看懂,干货满满 一张图将整个ReentrantLock流程看懂,干货满满 一张图将整个...
ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。在java关键字synchronized隐式支持重...
ReentrantLock 实现原理 1
可重入锁: 也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,...ReentrantLock 在Java也是一个基础的锁,ReentrantLock 实现Lock接口提供一系列的基础函数,开发人员可以灵活的是应用函数满足各种复杂多变应用场景;
ReentrantLock lock方法注释
助于理解的例子 博文链接:https://uule.iteye.com/blog/1488356
NULL 博文链接:https://patrick002.iteye.com/blog/2170391
公平与非公平的一个很本质的区别就是,是否遵守FIFO(也就是先来后到)。当有多个线程来申请锁的时候,是否先申请的线程先获取锁,后申请的线程后获取锁?如果是的,则是 公平锁 ,否则是 非公平锁 。 更准确地...
近日,阅读jdk并发包源码分析整理笔记。
ReentrantLock.java
Java多线程ReentrantLock1
AQS和ReentrantLock.pdf
本文将对ReentrantLock实现原理进行详细的介绍,具有很好的参考价值,下面跟着小编一起来看下吧