過多的同步可能會造成 相互不釋放資源 相互的等待 然後造成死鎖
代碼如下:
public class SnyTest {
public static void main(String[] args) {
Markup markup1 = new Markup(0,"大丫");
Markup markup2 = new Markup(1,"二丫");
markup1.start();
markup2.start();
}
}
//口紅
class Lipstick{
}
//鏡子
class Mirror{
}
//化妝
class Markup extends Thread{
static Lipstick lipstick = new Lipstick();
static Mirror mirror = new Mirror();
//選擇
int choice;
//名字
String girl;
public Markup(int choice,String girl){
this.choice=choice;
this.girl =girl;
}
public void run(){
//化妝
markup();
}
//相互持有對方的對象鎖 ---》可能造成死鎖
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 +"獲得口紅");
}
}
}
}
}
解決方法如下 改進:(不要進行鎖嵌套 即可解決 )
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 +"獲得口紅");
}
}
}