A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王会涛 中级黑马   /  2014-11-15 13:55  /  1660 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么死锁程序写出来,咋程序结果不容易死锁呢?
package day04;

class Test1 implements Runnable {
          Object locka = new Object();
          Object lockb = new Object();
        private boolean flag = true;

        Test1(boolean flag) {
                this.flag = flag;
        }

        public void run() {
                if (flag) {
                        while (true) {
                                synchronized (locka) {
                                        try {
                                                Thread.sleep(100);
                                        } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                        System.out.println("if lock");
                                        synchronized (lockb) {
                                                System.out.println("if lock");
                                        }

                                }
                        }
                } else {
                        while (true) {
                                synchronized (lockb) {
                                        try {
                                                Thread.sleep(100);
                                        } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }
                                        System.out.println("else lock");
                                        synchronized (locka) {
                                                System.out.println("else lock");
                                        }

                                }
                        }
                }
        }
}

public class DeadLockTest {

        public static void main(String[] args) {

                Thread t1 = new Thread(new Test1(true));
                Thread t2 = new Thread(new Test1(false));
               
                t1.start();
               
               
                t2.start();

        }

}
如果把Object locka = new Object();
          Object lockb = new Object();
改成
static Object locka = new Object();
static Object lockb = new Object();
立马就死锁了,为啥?
难道静态的东西和在内存中new一个对象有什么区别?

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 淡定

查看全部评分

10 个回复

倒序浏览
难道Object locka = new Object();
          Object lockb = new Object();

这个作为锁就不死锁了吗

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
静态的对象只会被建立一次
你new Test1的时候
如果先前没有new过Test1
也就是这是第一次new Test1
那么静态对象locka,lockb会被建立一次
但你再次new Test1的时候
内存中已经存在了静态的对象locka,lockb
不会再去新建

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
你看一下关系图就知道了,不加静态,一个线程两个锁,怎么可能会产生死锁。

2014-11-15_231612.png (12.28 KB, 下载次数: 19)

不加静态

不加静态

2014-11-15_232005.png (81.01 KB, 下载次数: 22)

加了静态

加了静态

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  Thread t1 = new Thread(new Test1(true));
  Thread t2 = new Thread(new Test1(false));

new了两次Test1,如果不是静态的话锁是不一样的
synchronized (locka) 也就是synchronized (this.locka)
回复 使用道具 举报
你应该是参照毕老师的视频写的程序吧,我昨天也看到了这里,你想一个事,他这集视频说了一句什么话,可能和谐,什么是和谐。。。回复完毕,楼主可以自己去看视频,多听几次
回复 使用道具 举报
如果资源类中:
static Object locka = new Object();
static Object lockb = new Object();

那么你资源类中会共享这个两个对象,并且当你新建另外一个资源类的对象,不会进行重新创建两个已经存在的静态成员;
所以你不管新建多少资源对象,他们的锁还是唯一的;所以同步的前提是锁的唯一性
回复 使用道具 举报
DamonZh 中级黑马 2014-11-16 15:59:52
8#
new两个Test1不就是生成了两个任务对象吗?那这两个线程操作的不就不是同一份数据了吗?不是应该new一个Test1,然后分别传给Thread吗?
回复 使用道具 举报
如果资源类中:
static Object locka = new Object();
static Object lockb = new Object();

那么你资源类中会共享这个两个对象,并且当你新建另外一个资源类的对象,不会进行重新创建两个已经存在的静态成员;
所以你不管新建多少资源对象,他们的锁还是唯一的;所以同步的前提是锁的唯一性
回复 使用道具 举报
wf111sxwf 来自手机 中级黑马 2014-11-16 21:04:36
10#
撸主是想写个死锁的例子
回复 使用道具 举报
Thread t1 = new Thread(new Test1(true));
Thread t2 = new Thread(new Test1(false));
其实我觉得是你是这句话没搞懂,  new Test1(); 的含义
产生 t1的时候,类Test加载,产生了两个锁locka,lockb,
产生t2的时候,这个事关键点,
static Object locka = new Object();
static Object lockb = new Object();
如果是静态的话,静态只加载一次,就不会产生锁了,t2和t1共用两个锁,可以锁住
如果 非静态
Object locka = new Object();
Object lockb = new Object();
new Test(false)会再创立两个锁, 给t2
那么t1 t2 各自有两把锁【一共四把】,名字还都一样,当t1执行的时候,怎么可能锁住t2呢?是不是了?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马