多线程-死锁
原理:
多个线程相互之间抱着互相需要的资源,形成了僵持,都停止执行的情况。某一同步块同时拥有两个及以上的锁时就有可能会发生“死锁”现象
死锁案例代码:
package com.heima.syn;
import org.w3c.dom.ls.LSOutput;
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() {
try {
makeup();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void makeup() throws InterruptedException {
if (choice == 0){
synchronized (lipstick){
System.out.println(this.girlname+"获得口红的锁");
Thread.sleep(1000);
synchronized (mirror){
System.out.println(this.girlname+"获得镜子的锁");
}
}
}
}else{
synchronized (mirror){
System.out.println(this.girlname+"获得镜子的锁");
Thread.sleep(1000);
synchronized (lipstick){
System.out.println(this.girlname+"获得口红的锁");
}
}
}
}
}
修正后代码:
package com.heima.syn;
import org.w3c.dom.ls.LSOutput;
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() {
try {
makeup();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void makeup() throws InterruptedException {
if (choice == 0){
synchronized (lipstick){
System.out.println(this.girlname+"获得口红的锁");
Thread.sleep(1000);
// synchronized (mirror){
// System.out.println(this.girlname+"获得镜子的锁");
// }
}synchronized (mirror){
System.out.println(this.girlname+"获得镜子的锁");
}
}else{
synchronized (mirror){
System.out.println(this.girlname+"获得镜子的锁");
Thread.sleep(1000);
// synchronized (lipstick){
// System.out.println(this.girlname+"获得口红的锁");
// }
}
synchronized (lipstick){
System.out.println(this.girlname+"获得口红的锁");
}
}
}
}