本帖最后由 aaronwang 于 2015-4-9 19:18 编辑
作为一名零基础自学毕老师精彩视频的学渣,时不时会有搞不懂的状况。这次是“死锁”(11天-15-死锁),毕老师给出了示例,代码见最下面。
程序试着运行几次,都“锁住了”,结果有两种,一种if a else b,另一种是else b if a. 一直没出现“和谐情况”。 细想之下,在else块中首行添加下句代码可以实现全部打印的目的 Thread.sleep(10); 看过视频的哥们都知道,这是毕老师生造出来的小例子,仅为说明死锁,没啥需要解决的问题。之后我琢磨了一个小例子来说明同步嵌套同步造成的死锁现象,给同样对该现象有疑惑的初学者们分享下。。。 需求:俩人(小黑和小白)管理仓库1和仓库2,现在需要分别在俩仓库里拿点货。 说明:看图,门1(M1)和门2(M2)分别用对应的钥匙打开。然后总共只有一套钥匙(保证钥匙撒手前对方是拿不到的)。 正常状况: ——小黑:来来来,老板让取笔和墨,我库房里有笔,白白你房里有墨。麻利点,赶紧的…… ——小白:跟我亲热个毛……我要拿Employee of the month,赶紧冲 然后俩人各抄起外门的钥匙就冲向库房了。结果,里门没钥匙,外门也自动锁上了。俩人都挂了…… 和谐情况:
——小黑:(脑子里飘过:我真的好爱他,我的小白)白,钥匙你都拿着,我等你……取了墨先送过去吧,别让头等急了……拿完把钥匙给我就成 ——小白:呃……
顺便提下毕老师说面试有可能会让写一个死锁的小例。 - public class DeadLockTest {
- public static void main(String[] args) {
- Test t1 = new Test(true);
- Test t2 = new Test(false);
-
- new Thread(t1).start();
- new Thread(t2).start();
- }
- }
- class MyLock {
- static Object a = new Object();
- static Object b = new Object();
- }
- class Test implements Runnable {
- public Test(boolean flag) {
- this.flag = flag;
- }
- private boolean flag;
-
- public void run() {
- if(flag) {
- synchronized(MyLock.a) {
- System.out.println("if a");
- synchronized(MyLock.b) {
- System.out.println("if b");
- }
- }
- } else {
- try {
- Thread.sleep(10);//添加本条代码可实现和谐状态。
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- synchronized(MyLock.b) {
- System.out.println("else b");
- synchronized(MyLock.a) {
- System.out.println("else a");
- }
- }
- }
- }
- }
复制代码
|