死锁\避免死锁
package TCPUDPThread;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* 死锁 死锁:多个线程各占有一些共享资源,并且互相等待其他线程占有的资源才能进行,而导致两个
* 或者多个线程都在等待对方释放资源,都停止执行的情形.某一个同步块同时拥有"两个以上对象的锁" 时,就可能会发生"死锁"的问题.
*
* 避免死锁发生:不要在同一个代码块中持有多个对象的锁
* @author pmc
*
*/
public class synchronizedTest9 {
public static void main(String[] args) {
Markup ma = new Markup(0, "老王");
ma.start();
ma = new Markup(1, "老张");
ma.start();
}
}
// 口红
class Lipstick {
}
// 镜子
class Mirror {
}
// 化妆
class Markup extends Thread {
static Lipstick lipstick = new Lipstick();
static Mirror mirror = new Mirror();
// 选择
int choice;
public Markup(int choice, String name) {
super(name);
this.choice = choice;
}
public void run() {
// 化妆
markup();
}
// 相互持有对方的对象锁->可能造成死锁
private void markup() {
if (choice == 0) {
synchronized (lipstick) {// 获得口红的锁
System.out.println(this.getName() + "获得口红");
// 1秒后拥有精子的锁
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// finally{
// System.out.println("最终语句");
// }
// synchronized (mirror) {
// System.out.println(this.getName() + "获得镜子");
// }
}
synchronized (mirror) {
System.out.println(this.getName() + "获得镜子");
}
} else {
synchronized (mirror) {// 获得口红的锁
System.out.println(this.getName() + "获得镜子");
// 2秒后拥有精子的锁
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// finally{
// System.out.println("最终语句");
// }
// synchronized (lipstick) {
// System.out.println(this.getName() + "获得口红");
// }
}
synchronized (lipstick) {
System.out.println(this.getName() + "获得口红");
}
}
}
}