死锁:多个线程相互抱着对方需要的资源,然后形成僵持
死锁案例
//死锁:多个线程相互抱着对方需要的资源,然后形成僵持
public class Deadlock {
public static void main(String[] args) {
Makeup g1 = new Makeup(0, "灰姑娘");
Makeup g2 = new Makeup(1, "白雪公主");
g1.start();
g2.start();
}
}
class Lipstick{
}
class Mirror{
}
class Makeup extends Thread{
//需要的资源只有一份,用static来保证只有一份
static Lipstick lipstick = new Lipstick();
static Mirror mirror = new Mirror();
int choice;
String girlName;
public Makeup(int choice, String girlName) {
this.choice = choice;
this.girlName = girlName;
}
@Override
public void run() {
//化妆
makeup();
}
//化妆,互相持有对方的锁,就是需要拿到对方的资源
private void makeup(){
if (choice==0){
synchronized (lipstick){//获得口红的锁
System.out.println(this.girlName+"获得口红的锁!");
//休息一秒
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (mirror){//一秒后想获得镜子
System.out.println(this.girlName+"获得镜子的锁!");
}
}
}else {
synchronized (mirror){//获得镜子的锁
System.out.println(this.girlName+"获得镜子的锁!");
//休息一秒
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lipstick){//2秒后想获得口红
System.out.println(this.girlName+"获得口红的锁!");
}
}
}
}
}
解决死锁:避免嵌套同步代码块
//解决死锁就是将持有的资源释放出来,同步代码块内不得嵌套同步代码块
public class HandleDeadlock {
public static void main(String[] args) {
Makeup1 g1 = new Makeup1(0, "灰姑娘");
Makeup1 g2 = new Makeup1(1, "白雪公主");
g1.start();
g2.start();
}
}
class Lipstick1{
}
class Mirror1{
}
class Makeup1 extends Thread{
//需要的资源只有一份,用static来保证只有一份
static Lipstick1 lipstick = new Lipstick1();
static Mirror1 mirror = new Mirror1();
int choice;
String girlName;
public Makeup1(int choice, String girlName) {
this.choice = choice;
this.girlName = girlName;
}
@Override
public void run() {
//化妆
makeup1();
}
//化妆,互相持有对方的锁,就是需要拿到对方的资源
private void makeup1(){
if (choice==0){
synchronized (lipstick){//获得口红的锁
System.out.println(this.girlName+"获得口红的锁!");
//休息一秒
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized (mirror){//一秒后想获得镜子
System.out.println(this.girlName+"获得镜子的锁!");
}
}else {
synchronized (mirror){//获得镜子的锁
System.out.println(this.girlName+"获得镜子的锁!");
//休息一秒
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized (lipstick){//2秒后想获得口红
System.out.println(this.girlName+"获得口红的锁!");
}
}
}
}