今天做了一个小实验,关于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:在资源竞争激烈的情况下,ReentrantLock 是一个很好的选择。 * Atomic:在激烈竞争的情况下,Atomic 的性能可以维持常态。 六、ReentrantLock 的实现 ReentrantLock 类 java.util.concurrent....
实验报告涉及的是操作系统中的经典问题——生产者-消费者问题,这是一个多线程并发控制的经典案例。在这个实验中,主要目标是通过Java编程实现基于信号量机制的进程(线程)同步和互斥,以模拟生产者和消费者如何...
在第一个实验中,为了确保不会卖出重复的电影票,采用了Java的并发控制机制——ReentrantLock。ReentrantLock是一个可重入锁,允许一个线程多次获取同一锁,这对于处理共享资源非常有用。在BoxOffice类中,定义了一...
实验一:基本I/O类的使用 在这个实验中,我们将接触到Java的基础I/O流模型,包括字节流和字符流。字节流主要用于处理二进制数据,如图像、音频文件等,而字符流则适用于处理文本数据。实验将涉及InputStream和...
在“操作系统实验 多线程同步与互斥 java编写 有界面”的实验中,可能需要设计一个图形用户界面(GUI),通过按钮或事件触发线程的创建和同步操作,直观地展示线程间的交互和同步效果。例如,可以模拟银行账户转账,...
在本实验报告中,我们关注的是Java多线程编程,这是Java编程中一个重要的主题,尤其是在并发处理和高性能系统设计中。线程是操作系统分配CPU时间的基本单位,它允许一个程序内部同时执行多个任务,提高了应用程序的...
【多线程实验】是计算机科学中的一个重要实践环节,尤其在Java编程中,多线程技术是实现并发处理和高效能应用的关键。本实验旨在帮助学生深入理解和掌握线程的相关概念,包括线程调度机制、线程同步机制,以及如何在...
以下是对这个实验主题的详细解释。 1. **Java多线程**:Java通过`Thread`类和`Runnable`接口支持多线程编程。创建新线程有两种主要方式:继承`Thread`类或实现`Runnable`接口。在Java中,主线程负责执行程序的主要...
Java中的线程是程序执行的最小单位,一个进程中可以包含多个线程,它们共享同一内存空间,但各自拥有独立的执行序列。 2. **创建线程**: - **继承Thread类**:创建一个新的类,该类继承自Thread类,并重写其run...
实验中,每个哲学家都有一个 ID,一个左叉子和一个右叉子。当哲学家想要吃饭时,他会先尝试获取左边的叉子,然后是右边的叉子。如果某个叉子已被其他哲学家持有,那么当前哲学家会等待直到叉子可用。吃完饭后,哲学...
在这个实验中,我们将通过一个由若干个缓冲区构成的循环缓冲队列来存放公共数据,多个生产者和消费者将通过这个缓冲队列来交换数据。 **生产者**负责生成数据并将其放入缓冲队列中。 **消费者**负责从缓冲队列中...
实验中还使用了LinkedBlockingQueue,这是一个基于链表结构的阻塞队列,适用于生产者-消费者模型。LinkedBlockingQueue维护了两个锁,takeLock和putLock,分别用于控制并发读和并发写。在并发读写时,由于读操作和写...
Thread类代表了一个线程的实例,而Runnable接口则定义了线程执行的任务。通过重写`run()`方法来实现线程的具体任务。 2. **Timer类和ThreadLocal**:Timer类用于调度周期性任务,如定时器任务。ThreadLocal则提供...
然后,编写一个`Scheduler`类,包含调度算法的逻辑,如选择下一个执行的进程、更新进程状态等。最后,通过主程序模拟多进程环境,创建多个`Process`对象,放入`Scheduler`中,执行调度循环。 总之,这个实验旨在让...
线程是程序中的一个单一顺序控制流,每个线程都有自己的程序计数器、系统栈和局部变量。在Java中,线程可以分为两种类型:用户线程和守护线程。用户线程是应用程序的一部分,直到所有用户线程结束,JVM才会退出;而...
Servlet线程同步计数器实验是Java Web开发中一个重要的实践课题,主要涉及到Servlet容器如何处理并发请求以及如何确保在多线程环境下的数据一致性。在这个实验中,我们将深入理解Servlet生命周期、线程模型以及线程...
在实验过程中,每个题目都会针对上述一个或多个知识点进行设计,通过实际操作来巩固理论知识。解决这些问题不仅能提高编程技巧,还能提升解决问题的能力。记住,实践是检验真理的唯一标准,不断练习和调试代码是成为...
每个实验通常会涉及上述部分或全部知识点,通过解答这些实验,学生能够更好地掌握Java语言的核心概念和技术,为实际项目开发打下坚实的基础。在学习过程中,对照实验答案,可以快速定位错误,理解解题思路,提高解决...