当多线程处理共享数据时,就会涉及到线程安全问题,采用同步代码块或者同步方法,资源交错,操作不当会产生死锁问题!如下是一个死锁的案例,仅供参考
class BreadMilk implements Runnable {
private String milk = "牛奶";// 保证有一份
private String bread = "面包";
boolean flag;// true,t1,执行,false,t2执行
@Override
public void run() {
if (flag) {
// t1线程执行
synchronized (milk) {
System.out.println(Thread.currentThread().getName() + ",已经拥有了"
+ milk);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (bread) {
System.out.println(Thread.currentThread().getName()
+ ",即拥有" + milk + ",又拥有" + bread);
}
}
} else {
// t2线程执行
synchronized (bread) {
System.out.println(Thread.currentThread().getName() + ",已经拥有了"
+ bread);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (milk) {
System.out.println(Thread.currentThread().getName()
+ ",即拥有" + bread + ",又拥有" + milk);
}
}
}
}
}
public class DeadLock {
public static void main(String[] args) {
BreadMilk mt1 = new BreadMilk();
BreadMilk mt2 = new BreadMilk();
mt1.flag = true;
mt2.flag = false;
Thread t1 = new Thread(mt1, "张三");
Thread t2 = new Thread(mt2, "李四");
t1.start();
t2.start();
}
}