并发之死锁:一个同步块同时拥有两个以上对象的锁就有可能发生死锁;
* 因为都在等待着对方释放资源而停止执行。
* 模拟:大丫有镜子,小丫有口红,大丫想要小丫的口红,
* 小丫想要大丫的镜子,互不退让。
//口红
class Lipstick{
}
//镜子
class Mirror{
}
//化妆
class Markup implements Runnable{
static Lipstick lipstick = new Lipstick();
static Mirror mirror = new Mirror();
int chioce;//选择
String name;
public Markup(int chioce, String name) {
this.chioce = chioce;
this.name = name;
}
@Override
public void run() {
markup();
}
public void markup(){
if(chioce == 0){
synchronized (lipstick){
System.out.println(this.name+"涂口红");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (mirror){
System.out.println(this.name+"照镜子");
}
}
}else {
synchronized (mirror){
System.out.println(this.name+"照镜子");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lipstick){
System.out.println(this.name+"涂口红");
}
}
}
}
}
调用:
Markup g1 = new Markup(0,"小华");
Markup g2 = new Markup(1,"小花");
new Thread(g1).start();
new Thread(g2).start();
执行:
小华涂口红
小花照镜子
双方都等着对方,都占着对方要的东西(锁),都不释放。修改代码
public void markup(){
if(chioce == 0){
synchronized (lipstick){
System.out.println(this.name+"涂口红");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// synchronized (mirror){//放这里会造成死锁
// System.out.println(this.name+"照镜子");
// }
}
synchronized (mirror){//放这里 解决死锁
System.out.println(this.name+"照镜子");
}
}else {
synchronized (mirror){
System.out.println(this.name+"照镜子");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// synchronized (lipstick){
// System.out.println(this.name+"涂口红");
// }
}
synchronized (lipstick){
System.out.println(this.name+"涂口红");
}
}
}
执行:
小华涂口红
小花照镜子
小花涂口红
小华照镜子