当前位置:  技术问答>java相关

关于死锁的一个程序,有几个地方不明白,请教一下

    来源: 互联网  发布时间:2015-03-09

    本文导语:  public class Deadlock implements Runnable {   public static void main(String[] args)   {     Object a = "Resource A";     Object b = "Resource B";     Thread t1 = new Thread(new Deadlock(a, b));     Thread t2 = new Thread(new Deadlock(b,...

public class Deadlock implements Runnable
{
  public static void main(String[] args)
  {
    Object a = "Resource A";
    Object b = "Resource B";
    Thread t1 = new Thread(new Deadlock(a, b));
    Thread t2 = new Thread(new Deadlock(b, a));
    t1.start();
    t2.start();
  }

  private Object firstResource;
  private Object secondResource;

  public Deadlock(Object first, Object second)
  {
    firstResource = first;
    secondResource = second;
  }

  public void run()
  {
    for (;;)
    {
      System.out.println(Thread.currentThread().getName()+" Looking for lock on "+firstResource);

      synchronized (firstResource)
      {
        System.out.println(Thread.currentThread().getName()+" Obtained lock on "+firstResource);
        System.out.println(Thread.currentThread().getName()+" Looking for lock on " + secondResource);
        synchronized (secondResource)
        {
          System.out.println(Thread.currentThread().getName()+" Obtained lock on "+secondResource);
          // simulate some time consuming activity
          try
          {
            Thread.sleep(100);
          }
          catch (InterruptedException ex) {}
        }
      }
    }
  }
}
输出结果:
Thread-0 Looking for lock on Resource A
Thread-0 Obtained lock on Resource A
Thread-0 Looking for lock on Resource B
Thread-0 Obtained lock on Resource B
Thread-1 Looking for lock on Resource B
Thread-1 Obtained lock on Resource B
Thread-1 Looking for lock on Resource A
Thread-1 Obtained lock on Resource A
Thread-0 Looking for lock on Resource A
Thread-1 Looking for lock on Resource B
Thread-0 Obtained lock on Resource A
Thread-0 Looking for lock on Resource B
Thread-1 Obtained lock on Resource B
Thread-1 Looking for lock on Resource A
(死锁中......)

   上面这个程序的死锁原理我是知道的,就是线程0获得了对象A的锁,在等待获得对象B的锁;而线程B刚好相反。所以造成了死锁。但是看这个程序后有几个问题不懂,请教一下各位:

  1.synchronized (对象 a) { } 这样的写法是不是将这个对象a锁定,只能同时让一个线程使用?
    2.输出结果为什么是这样的?能不能把输出结果一行一行的解释来听听?

|
that paragraph is got from the JDK's document. and the book u mentioned I did not read ever. 

ur understanding is right i think.

the staus of a thread can be one of these:new,runnable(ready u said),running,dead,blocked. a thread be running must be runnable first just as u said above, for there a thread pool and JVM will has it's own arithmetic to pick which runnable thread actually run from the pool. but we can omit this step if we no need care much about the time for make the thread from runnable to running. so there's no confliction between what i said and ur words.

|
我把sleep的时机改了一下我想有助于你理解。其实以上的代码发生死锁的概率要比下面的代码小一些而以

public class Deadlock implements Runnable
{
  public static void main(String[] args)
  {
    Object a = "Resource A";
    Object b = "Resource B";
    Thread t1 = new Thread(new Deadlock(a, b));
    Thread t2 = new Thread(new Deadlock(b, a));
    t1.start();
    t2.start();
  }

  private Object firstResource;
  private Object secondResource;

  public Deadlock(Object first, Object second)
  {
    firstResource = first;
    secondResource = second;
  }

  public void run()
  {
    for (;;)
    {
      System.out.println(Thread.currentThread().getName()+" Looking for lock on "+firstResource);

      synchronized (firstResource)
      {
        System.out.println(Thread.currentThread().getName()+" Obtained lock on "+firstResource);
          try
          {
            Thread.sleep(1000);
          }
          catch (InterruptedException ex) {}
        System.out.println(Thread.currentThread().getName()+" Looking for lock on " + secondResource);
        synchronized (secondResource)
        {
          System.out.println(Thread.currentThread().getName()+" Obtained lock on "+secondResource);
          // simulate some time consuming activity
        }
      }
    }
  }
}

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 有n个进程的系统出现死锁,死锁进程个数k应该满足什么条件?
  • 操作系统死锁问题
  • 这样会死锁吗?
  • 操作系统的使用的处理死锁的算法
  • 问一个很基础的问题,单进程会不会产生死锁?
  • 一道操作系统的死锁题目
  • “死锁就是循环等待”这句话不对吗?谢谢!
  • sql server表死锁查不出数据的解决方法
  • 查找sqlserver查询死锁源头的方法 sqlserver死锁监控
  • Java多线程程序死锁检查 JCarder
  • 关于标准输出的缓冲造成的死锁
  • 请问在操作系统的设计中,死锁和饥饿的本质区别是什么?
  • 关于死锁,高手请进!
  • 多进程的并发系统中,肯定不会因竞争( )而产生死锁。
  • C中用system系统调用执行command,执行过程中死锁,如何处理?
  • JBuilder 6 在 winxp 下使用微软拼音输入法,输入中文。出现不正常。jbuilder.死锁
  • SQLServer 中的死锁说明
  • SQL Server 死锁原因分析与解决办法
  • 关于这个死锁的疑惑
  • 增加进程数或减少进程数在任何情况下都不会引起死锁吗?谢谢!!!!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3