public class MyTest {
public static void main(String[] args) {
Print3 print = new Print3();
new Thread(){
public void run() {
for(int i=1;i<=100;i++){
try {
print.print1();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}.start();
new Thread(){
public void run() {
for(int i=1;i<=100;i++){
try {
print.print2();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}.start();
new Thread(){
public void run() {
for(int i=1;i<=100;i++){
try {
print.print3();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}.start();
}
}
class Print3{
private ReentrantLock r = new ReentrantLock();
private Condition c1 = r.newCondition();
private Condition c2 = r.newCondition();
private Condition c3 = r.newCondition();
private int flag = 1;
public void print1() throws InterruptedException{
/*
* 获取锁 这边相当于synchronized同步代码块
*/
r.lock();
System.out.println("print1...........拿到了锁");
if(flag != 1){
/*
* 相当于同步代码块中,锁对象.wait()
*/
System.out.println("print1........wait 前");
c1.await();
System.out.println("print1...........wait 后");
}
System.out.print("黑");
System.out.print("马");
System.out.print("程");
System.out.print("序");
System.out.print("员");
System.out.print("\r\n");
//注意:这边故意把flag设置为3,模拟死锁的情况
flag = 3;
/*
* 在两个以上线程时候,之前只能通过锁对象.notifyAll()来唤醒其他所有的等待线程,
* 不能指定唤醒哪个线程。
* 使用Condition能指定唤醒哪个线程
*/
c2.signal();
System.out.println("print1..........释放锁");
r.unlock(); //释放锁
}
public void print2() throws InterruptedException{
r.lock();
System.out.println("print2...........拿到了锁");
//其他线程调用 signal()来唤醒的时候,先执行await()后的代码,然后判断while,满足条件
//继续执行while里面的语句,如果是if只是执行await()后的代码,不再判断if条件
while(flag != 2){
System.out.println("print2 await 前");
c2.await();
System.out.println("print2 await 后");
}
System.out.print("传");
System.out.print("智");
System.out.print("播");
System.out.print("客");
System.out.print("\r\n");
flag = 3;
c3.signal();
System.out.println("print2...........释放了锁");
r.unlock();
}
public void print3() throws InterruptedException{
r.lock();
System.out.println("print3...........拿到了锁");
if(flag != 3){
System.out.println("print3..........await 前");
c3.await();
System.out.println("print3.......... await 后");
}
System.out.print("i");
System.out.print("t");
System.out.print("h");
System.out.print("e");
System.out.print("i");
System.out.print("m");
System.out.print("a");
System.out.print("\r\n");
flag = 1;
c1.signal();
System.out.println("print3...........释放了锁");
r.unlock();
}
}
print1...........拿到了锁
黑马程序员
print1..........释放锁
print1...........拿到了锁
print1........wait 前
print2...........拿到了锁
print2 await 前
print3...........拿到了锁
itheima
print3...........释放了锁
print3...........拿到了锁
print3..........await 前
print1...........wait 后
黑马程序员
print1..........释放锁
print1...........拿到了锁
print1........wait 前
print2 await 后
print2 await 前
如上代码会造成, print1、print2、print3 涉及的三个线程全都 awat 的情况,都在等待被signal()唤醒,出现了死锁。