在一个同步块同时持有两个以上对象的锁时,就可能会发生死锁的问题,死锁就是各自抱着资源不释放,比如一手交一手交货,商家说你给我钱我给你货,顾客说你给我货我给你钱,大家都不信任对方,造成尴尬的局面。还有就是小丫拿着镜子,想要口红,大丫拿的口红想要镜子,相互之间不礼让,就会造成死锁。

仿写小丫和大丫这个案例
package com.cb.thread.day05;
/*
* 死锁:过多的同步可能造成相互不释放资源
* 从而相互等待,一般发生于同步中持有多个对象的锁
*/
public class DeadLock {
public static void main(String[] args) {
Markup g1 = new Markup(1, "大丫");
Markup g2 = new Markup(2, "二丫");
g1.start();
g2.start();
}
}
//口红
class Lips{
}
//镜子
class Mirror{
}
//化妆
class Markup extends Thread{
//加了静态表示一份,不管创建几个都是一份
static Lips lips = new Lips();
static Mirror mirror = new Mirror();
//选择
int choice;
//名字
String girl;
public Markup(int choice,String girl) {
this.choice = choice;
this.girl = girl;
}
@Override
public void run() {
markup();
}
//化妆
private void markup(){
if (choice==1) {
synchronized(lips){//获得口红的锁
System.out.println(this.girl+"涂口红");
//1秒后想拥有镜子的锁
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (mirror) {
System.out.println(this.girl+"照镜子");
}
}
}else {
synchronized(mirror){//获得镜子的锁
System.out.println(this.girl+"照镜子");
//1秒后想拥有镜子的锁
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lips) {
System.out.println(this.girl+"涂口红");
}
}
}
}
}
运行结果:大丫占着口红,没有镜子,所以不释放资源,二丫有镜子没有口红,也不释放资源,所以就死锁了。

解决方法:不要在同一个代码块中,同时持有多个对象的锁
package com.cb.thread.day05;
/*
* 死锁:过多的同步可能造成相互不释放资源
* 从而相互等待,一般发生于同步中持有多个对象的锁
*
* 避免:不要在同一个代码块中,同时持有多个对象的锁
*/
public class DeadLock {
public static void main(String[] args) {
Markup g1 = new Markup(1, "大丫");
Markup g2 = new Markup(2, "二丫");
g1.start();
g2.start();
}
}
//口红
class Lips{
}
//镜子
class Mirror{
}
//化妆
class Markup extends Thread{
//加了静态表示一份,不管创建几个都是一份
static Lips lips = new Lips();
static Mirror mirror = new Mirror();
//选择
int choice;
//名字
String girl;
public Markup(int choice,String girl) {
this.choice = choice;
this.girl = girl;
}
@Override
public void run() {
markup();
}
//化妆
private void markup(){
if (choice==1) {
synchronized(lips){//获得口红的锁
System.out.println(this.girl+"涂口红");
//1秒后想拥有镜子的锁
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
/*synchronized (mirror) {
System.out.println(this.girl+"照镜子");
}*/
}
synchronized (mirror) {
System.out.println(this.girl+"照镜子");
}
}else {
synchronized(mirror){//获得镜子的锁
System.out.println(this.girl+"照镜子");
//1秒后想拥有镜子的锁
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
/*synchronized (lips) {
System.out.println(this.girl+"涂口红");
}*/
}
synchronized (lips) {
System.out.println(this.girl+"涂口红");
}
}
}
}
运行结果:

本文通过生动案例解析了死锁现象,即多个线程因互相等待对方持有的资源而不释放自身资源,导致系统陷入僵局。并通过调整代码逻辑,避免在同一代码块中持有多个对象锁,有效解决了死锁问题。
3万+

被折叠的 条评论
为什么被折叠?



