package ThreadTest.Day3;
/**
* @author CCQ
* 死锁问题
*/
public class Test04 {
public static void main(String[] args) {
HZ hz1 =new HZ(0);
HZ hz2 =new HZ(1);
new Thread(hz1,"棋棋").start();
new Thread(hz2,"瑶瑶").start();
}
}
//口红
class JZ{
}
//镜子
class KH{
}
//化妆
class HZ implements Runnable{
static JZ jz =new JZ();
static KH kh =new KH();
int choice;
public HZ(int choice) {
this.choice = choice;
}
@Override
public void run() {
if (choice ==0){
synchronized (jz){
System.out.println(Thread.currentThread().getName()+"获得了镜子的锁");
try {
Thread.sleep(2_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (kh){
System.out.println(Thread.currentThread().getName()+"获得了口红的锁");
}
}
}else {
synchronized (kh){
System.out.println(Thread.currentThread().getName()+"获得了口红的锁");
try {
Thread.sleep(2_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (jz){
System.out.println(Thread.currentThread().getName()+"获得了镜子的锁");
}
}
}
}
}
输出结果:
棋棋获得了镜子的锁
瑶瑶获得了口红的锁
解决方法:
//解决方法
class demo {
public static void main(String[] args) {
hz hz1 = new hz(0);
hz hz2 = new hz(1);
new Thread(hz1,"棋棋").start();
new Thread(hz2,"瑶瑶").start();
}
}
//化妆
class hz implements Runnable{
static JZ jz =new JZ();
static KH kh =new KH();
int choice;
public hz(int choice) {
this.choice = choice;
}
@Override
public void run() {
if (choice ==0){
synchronized (jz){
System.out.println(Thread.currentThread().getName()+"获得了镜子的锁");
try {
Thread.sleep(2_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized (kh){
System.out.println(Thread.currentThread().getName()+"获得了口红的锁");
}
}else {
synchronized (kh){
System.out.println(Thread.currentThread().getName()+"获得了口红的锁");
try {
Thread.sleep(2_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized (jz){
System.out.println(Thread.currentThread().getName()+"获得了镜子的锁");
}
}
}
}
输出结果:
棋棋获得了镜子的锁
瑶瑶获得了口红的锁
棋棋获得了口红的锁
瑶瑶获得了镜子的锁
Process finished with exit code 0