package com.zl.reentranlock;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
/**
*
* @author 丢了风筝的线
* @see 测试可重入锁/互斥锁,可以让指定的线程等待或者唤醒指定的线程
* @see 2019年12月25日
*/
public class ReentranLockTest {
public static void main(String[] args) {
final Print1 p = new Print1();
new Thread() {
@Override
public void run() {
while (true) {
try {
p.print1();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
new Thread() {
@Override
public void run() {
while (true) {
try {
p.print2();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
new Thread() {
@Override
public void run() {
while (true) {
try {
p.print3();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
}
class Print1 {
int flag = 1;
// 获取可从入锁对象
private final ReentrantLock lock = new ReentrantLock();
// 获取标识线程锁对象
final Condition c1 = lock.newCondition();
final Condition c2 = lock.newCondition();
final Condition c3 = lock.newCondition();
public void print1() throws InterruptedException {
lock.lock();
if (flag != 1) {
// 使指定的线程等待
c1.await();
}
System.out.print("人");
System.out.print("生");
System.out.print("在");
System.out.print("世");
System.out.println();
// 更改标记
flag = 2;
// 唤醒指定的线程
c2.signal();
// 释放锁
lock.unlock();
}
public void print2() throws InterruptedException {
lock.lock();
if (flag != 2) {
c2.await();
}
System.out.print("不");
System.out.print("论");
System.out.print("当");
System.out.print("下");
System.out.print("你");
System.out.print("我");
System.out.println();
flag = 3;
c3.signal();
lock.unlock();
}
public void print3() throws InterruptedException {
lock.lock();
if (flag != 3) {
c3.await();
}
System.out.print("当");
System.out.print("会");
System.out.print("峰");
System.out.print("独");
System.out.print("行");
System.out.print("为");
System.out.print("红");
System.out.print("颜");
System.out.println();
flag = 1;
c1.signal();
lock.unlock();
}
}
可重入锁的使用,指定等待和唤醒指定的线程
最新推荐文章于 2022-12-11 20:48:03 发布