黑马程序员技术交流社区
标题: 关于死锁的问题 [打印本页]
作者: 杜成龙 时间: 2013-9-27 22:40
标题: 关于死锁的问题
本帖最后由 杜成龙 于 2013-9-28 14:32 编辑
请大家帮忙看下,这个程序怎么会出现死锁呢? - class Test implements Runnable
- {
- private boolean flag;
- Test(boolean flag)
- {
- this.flag=flag;
- }
- public void run()
- {
- if(flag)
- {
- synchronized(MyLock.locka)
- {
- System.out.println("if locka");
- synchronized(MyLock.lockb)
- {
- System.out.println("if lockb");
- }
- }
- }
- else
- {
- synchronized(MyLock.lockb)
- {
- System.out.println("else lockb");
- synchronized(MyLock.locka)
- {
- System.out.println("else locka");
- }
- }
- }
- }
- }
- class MyLock
- {
- static Object locka=new Object();
- static Object lockb=new Object();
-
- }
- class DeadLockTest
- {
- public static void main(String[] args)
- {
- Thread t1=new Thread(new Test(true));
- Thread t2=new Thread(new Test(false));
- t1.start();
- t2.start();
- }
- }
复制代码
程序中,有两句代码:
Thread t1=new Thread(new Test(true));
Thread t2=new Thread(new Test(false));
这不是相当于创建了两个Test对象吗?并且创建了两个线程分别来执行两个Test对象中run中的代码吗?
那么这两个对象都是独立的,它们又没有联系,自己的线程执行自己run中的代码,那又怎么会出现死锁呢?
作者: 蔚蓝天色 时间: 2013-9-27 23:18
嗯,是这样的,方法是独立的,资源也是各自的,但是,出现死锁的前提是访问目标被synchornized修饰了的,synchornized修饰之后,这个资源就被所有对象全部共享了,就好比每个人手里都有一碗饭,但是筷子只有一双,只能一个人吃一口自己碗里的饭,但是如果饭被synchornied修饰了,就代表着,大家都把饭倒进了一个桶里,排着队大家一口一口的吃,此时,这桶饭就是共享资源,也就是临界资源,但是如果一个人吃着吃着(sleep())睡着了,其他的人也只有等着了,这就是死锁
作者: 早知道 时间: 2013-9-27 23:20
一段代码只要有synchronized,同一时间就只能被一个线程访问,出现死锁应该是线程1持有锁1,线程2持有锁2,两个线程各持有一个锁,所以执行不下去。这段代码应该是故意要死锁的,这样写。
作者: 杨增坤 时间: 2013-9-28 09:53
希望你能理解!
-
死锁.png
(27 KB, 下载次数: 13)
作者: 睡不够的猪 时间: 2013-9-28 12:36
我是这么理解的 当一个线程执行到synchronized之后 相当于拿到了锁 只要对应的那段程序没运行完 就会一直拿着 你这段程序中 当线程1执行到了locka时 线程1就拿到了locka 接下来他要往下执行就需要拿到lokb 而正好这个时候线程2拿到了lockb 线程2想要继续就要locka 这个时候就发生了一个很有趣的现象 就是线程1管线程2要lockb 线程2管线程1要locka 这样两个线程都拿不到自己想要的锁 就成了死锁。
作者: 杜成龙 时间: 2013-9-28 14:33
谢谢各位了!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |