“死锁”指的是:
多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能进行,而导致两个或者多个线程都在等待对方释放资源,都停止执行的情形。
因此, 某一个同步块需要同时拥有“两个以上对象的锁”时,就可能会发生“死锁”的问题。
package cn.sxt.thread;
public class TestDeadLock {
public static void main(String[] args) {
MakeUp girl1=new MakeUp("王菲");
MakeUp girl2=new MakeUp("尔雅");
girl1.flag=0;
girl2.flag=1;
girl1.start();
girl2.start();
}
}
class Mirror{
}
class LipStick{
}
class MakeUp extends Thread{
int flag=0;
String name;
static LipStick ls=new LipStick();
static Mirror m=new Mirror();
public MakeUp(String name){
this.name=name;
}
@Override
public void run() {
doMakeup();
}
void doMakeup(){
if (flag == 0) {
synchronized (ls) {
System.out.println(name + "拿着口红");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (m) {
System.out.println(name + "拿着镜子啊");
}
}
} else {
synchronized (m) {
System.out.println(name + "拿着镜子");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (ls) {
System.out.println(name + "拿着口红");
}
}
}
}
}
输出:
尔雅拿着镜子
王菲拿着口红
切换线程时由于锁代码块未执行完毕,没有释放资源,双方同时想拿到对方资源由此陷入死锁
此时进行修改,将另一锁对象,置于锁代码块外则可解决问题,原因为,执行完锁代码快后将其资源释放.
package cn.sxt.thread;
public class TestDeadLock {
public static void main(String[] args) {
MakeUp girl1=new MakeUp("王菲");
MakeUp girl2=new MakeUp("尔雅");
girl1.flag=0;
girl2.flag=1;
girl1.start();
girl2.start();
}
}
class Mirror{
}
class LipStick{
}
class MakeUp extends Thread{
int flag=0;
String name;
static LipStick ls=new LipStick();
static Mirror m=new Mirror();
public MakeUp(String name){
this.name=name;
}
@Override
public void run() {
doMakeup();
}
void doMakeup(){
if (flag == 0) {
synchronized (ls) {
System.out.println(name + "拿着口红");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized (m) {
System.out.println(name + "拿着镜子啊");
}
} else {
synchronized (m) {
System.out.println(name + "拿着镜子");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized (ls) {
System.out.println(name + "拿着口红");
}
}
}
}
输出:
王菲拿着口红
尔雅拿着镜子
王菲拿着镜子啊
尔雅拿着口红