鱼C论坛

 找回密码
 立即注册
查看: 4365|回复: 11

关于java死锁的情况

 关闭 [复制链接]
发表于 2014-9-18 11:10:08 | 显示全部楼层 |阅读模式
100鱼币
1.看看下面的代码会发生死锁的情况吗?
  我的机子试了好几次也没出现死锁的情况。

class Thread_1  implements Runnable
{
        Object obj  = new Object();
         int i  = 100;

        public synchronized void show2()
        {
                        if(i>0)
                        {       
                                synchronized(obj)
                                {
                                        System.out.println(Thread.currentThread().getName()+"   "+i);
                                        i--;       
                                }
                        }               
        }
        public  void run()
        {
                while(i>0)
                {       
                        synchronized(obj)
                        {
                                show2();       
                        }

                }
        }
}
public class ThreadTest
{
        public static void main(String[] args)
        {
                Thread_1 t = new Thread_1();
                new Thread(t).start();
                new Thread(t).start();
        }
}


2,下面是一个绝对死锁的程序
class MyThread implements Runnable
{
OBJ o = new OBJ();
boolean flag = true;
MyThread (boolean flag)
{
this.flag = flag;
}
static int i = 100;
public void run()
{
if (flag)
{
  while(i>0)
{
  synchronized(OBJ.obja )
  {          
  System.out.println(i--);  
  synchronized(OBJ.objb )
{
  System.out.println(i--);
}
}
}
}
  else
  {
while(i>0)
{
synchronized(OBJ.objb )
{
  System.out.println(i--);
  synchronized(OBJ.obja )
{
  System.out.println(i--);
}
}
}

  }
}
}


class OBJ
{
//这个是锁对象的类
static Object obja = new Object();
static Object objb = new Object();

Object objc = new Object();
Object objd = new Object();

public Object getObjc()
{
         return objc;
}

public Object getObjd()
{
         return objd;
}

}

public class DeadLock {

public static void main(String[] args)
{
new Thread(new MyThread(true)).start();
new Thread(new MyThread(false)).start();
}
}




但是如果我把锁换成了非静态属性的,则情况又会不一样了,这是为什么呢?
如下程序。
class MyThread implements Runnable
{
OBJ o = new OBJ();
boolean flag = true;
MyThread (boolean flag)
{
this.flag = flag;
}
static int i = 100;
public void run()
{
if (flag)
{
  while(i>0)
{
  synchronized(o.getObjc())
  {          
  System.out.println(i--);  
  synchronized(o.getObjd())
{
  System.out.println(i--);
}
}
}
}
  else
  {
while(i>0)
{
synchronized(o.getObjd() )
{
  System.out.println(i--);
  synchronized(o.getObjc() )
{
  System.out.println(i--);
}
}
}
  
  }
}
}



class OBJ
{
//这个是锁对象的类
static Object obja = new Object();
static Object objb = new Object();

final  Object objc = new Object();
final  Object objd = new Object();

public Object getObjc()
{
         return objc;
}

public Object getObjd()
{
         return objd;
}


}

public class DeadLock {

public static void main(String[] args)
{
new Thread(new MyThread(true)).start();
new Thread(new MyThread(false)).start();
}
}



最佳答案

查看完整内容

首先我想绝对的死锁应该是不存在的!分析一下这个程序! 总共是两个线程!但是只有两个锁!因为是同步的!假如:当执行第一个线程的时候!CPU获得obja,因为CPU获取那个锁是不确定的,所以死锁的状态才是不确定的!你的程序我想只有CPU执行完obja然后获得第二个线程的锁的时候才会出现死锁吧! 这种机率比较少一些!就像我的那个死锁!当执行完Thread-0:1然后CPU切到第二个线程执行Thread-1:3然后在执行的时候,就冲突了! 就死锁 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-18 11:10:09 | 显示全部楼层
首先我想绝对的死锁应该是不存在的!分析一下这个程序! 总共是两个线程!但是只有两个锁!因为是同步的!假如:当执行第一个线程的时候!CPU获得obja,因为CPU获取那个锁是不确定的,所以死锁的状态才是不确定的!你的程序我想只有CPU执行完obja然后获得第二个线程的锁的时候才会出现死锁吧! 这种机率比较少一些!就像我的那个死锁!当执行完Thread-0:1然后CPU切到第二个线程执行Thread-1:3然后在执行的时候,就冲突了! 就死锁了!也就是说第一个线程的锁还没释放!这主要取决于CPU执行到谁!而且我在运行下面两个程序的时候! 无论OBJ的属性是静态的还是非静态的,与死锁也没多大关系!所以!呵呵!也别太纠结这个问题了! 知识CPU的切换效率问题而已!
QQ截图20140924091745.png

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +1 收起 理由
Angel丶L + 2 + 2 + 1 楼主加油 已经奖励

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-18 13:17:37 | 显示全部楼层
不会 就顶下.....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-9-18 14:02:02 | 显示全部楼层

版主哪去了呢?  @ 百日维新
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-18 20:03:05 | 显示全部楼层
稍等,现在用不了电脑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-18 21:49:37 | 显示全部楼层
@百日维新 过来看看 JAVA的太菜 才学。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-19 00:49:40 | 显示全部楼层
sorry这位同学,我们老师讲线程就提一下,平时我也都是搞web方向的东西,对java细节也没怎么研究啊,
看看这篇文章吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-19 00:52:18 | 显示全部楼层
我觉得吧,细节这种东西没有必要钻牛角尖,以后经验多了自然会懂:lol:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-22 10:24:22 | 显示全部楼层
恩.....,我试了一下!死锁只出现了一次! 在第二个程序中,可是以后就不出现死锁了! 而且!不知道是我看错了没有! 你说:把锁换成非静态是另一种情况! 可是你的最后两个程序是一样的啊!恩....,这是我的一个死锁的例子!你看一下! 上面也有我的注释:



  1. public class DeathLock{

  2.    public static void main(String[] args) {

  3.            /**
  4.                         首先前提条件线程 0 和线程 1 同时开启,CPU 切换到线程 0,打印输出 Thread-0:1,这时 CPU 切换到 线程 1 打
  5.                         印输出 Thread-1:3, 当线程 1 继续执行内部的同步代码块的时候发现内部的同步代码块和线程 0
  6.                         的外部同步代码块使用了相同的锁对象 lock1,所以线程 1 会等待 CPU 切换到线程 0 等待与之同步的代码执行完毕,
  7.                         当线程 0 重新获取到 CPU 资源继续执行自身内部的同步代码块的时候发现线程 1 中的外部同步代码块和它具有同样的锁对象
  8.                         lock2,所以线程 0 就会等待 CPU
  9.                         切换到线程 1 等待与之同步的代码执行完毕,而这时线程 1 也在等待线程 0 的执行完毕,2 组代码相互等待,出现死锁。
  10.            */

  11.        final Object lock1 = new Object();
  12.        final Object lock2 = new Object();

  13.        /** 线程 0 **/
  14.        new Thread() {
  15.            public void run() {
  16.                synchronized (lock1) {
  17.                    System.out.println(Thread.currentThread().getName() + ":1");
  18.                    synchronized (lock2) {
  19.                        System.out.println(Thread.currentThread().getName() + ":2");
  20.                    }
  21.                }
  22.            };
  23.        }.start();

  24.        /** 线程 1 **/
  25.        new Thread() {
  26.            public void run() {
  27.                synchronized (lock2) {
  28.                    System.out.println(Thread.currentThread().getName() + ":3");
  29.                    synchronized (lock1) {
  30.                        System.out.println(Thread.currentThread().getName() + ":4");
  31.                    }
  32.                }
  33.            };
  34.        }.start();
  35.    }
  36. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-9-23 20:47:48 | 显示全部楼层
青玄 发表于 2014-9-22 10:24
恩.....,我试了一下!死锁只出现了一次! 在第二个程序中,可是以后就不出现死锁了! 而且!不知道是我看错 ...

嗯,你这代码确实是会出现死锁情况。按理说和我最后一个程序是相同的,可我最后一个程序用死循环运行也不见有死锁的情况发生,我也不清楚究竟的原因。你再运行我下面的两个程序对比看看吧,我用的锁的属性是不一样的。麻烦你了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-9-24 11:47:51 | 显示全部楼层
青玄 发表于 2014-9-24 09:57
首先我想绝对的死锁应该是不存在的!分析一下这个程序! 总共是两个线程!但是只有两个锁!因为是同步的! ...

我想还应该跟系统的多核心有关。好吧,以后有时间学习学习小甲鱼的操作系统的课程时,应该这问题就解决了,很感谢你的热情回答。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-25 08:57:28 | 显示全部楼层
谢家进 发表于 2014-9-24 11:47
我想还应该跟系统的多核心有关。好吧,以后有时间学习学习小甲鱼的操作系统的课程时,应该这问题就解决了 ...

呵呵! 不用客气!:big
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 16:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表