一、死锁
二、案例
(1)
package com.dhu.thread.cinema;
class LipStack{
}class Mirror{
}class Markup implements Runnable{
static LipStack lipstick = new LipStack();
static Mirror mirror = new Mirror();
private int choice;
private String girl;
@Override
public void run() {
markup();
}
public Markup(int choice,String girl) {
this.choice = choice;
this.girl = girl;
}
/**
* 相互持有对方的对象锁 -> 可能造成死锁
*/
private void markup() {
if(choice == 0) {
synchronized(lipstick) {
System.out.println(this.girl + "获得口红");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(mirror) {
System.out.println(this.girl + "获得镜子");
}
}
}
else {
synchronized(mirror) {
System.out.println(this.girl + "照镜子");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(lipstick) {
System.out.println(this.girl + "涂口红");
}
}
}
}
}public class DeadLock {
public static void main(String[] args) {
Markup g1 = new Markup(0, "小米");
Markup g2 = new Markup(1, "大野");
new Thread(g1).start();
new Thread(g2).start();
}}
运行结果:
(2)修改
package com.dhu.thread.cinema;
class LipStack{
}
class Mirror{
}
class Markup implements Runnable{
static LipStack lipstick = new LipStack();
static Mirror mirror = new Mirror();
private int choice;
private String girl;
@Override
public void run() {
markup();
}
public Markup(int choice,String girl) {
this.choice = choice;
this.girl = girl;
}
/**
* 相互持有对方的对象锁 -> 可能造成死锁
*/
private void markup() {
if(choice == 0) {
synchronized(lipstick) {
System.out.println(this.girl + "获得口红");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized(mirror) {
System.out.println(this.girl + "获得镜子");
}
}
else {
synchronized(mirror) {
System.out.println(this.girl + "照镜子");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized(lipstick) {
System.out.println(this.girl + "涂口红");
}
}
}
}
public class DeadLock {
public static void main(String[] args) {
Markup g1 = new Markup(0, "小米");
Markup g2 = new Markup(1, "大野");
new Thread(g1).start();
new Thread(g2).start();
}
}
运行结果: