线程死锁的质疑

问题描述

在网上搜到一篇线程死锁的博客,后来发现,两个线程并不会发生死锁。我的理由是Threadthread01=newThread(run01);Threadthread02=newThread(run02);这两个线程构造函数传进来的参数Runnable对象run01,run02,会分别创建obj1、obj2,也就说两个线程通过synchronized(obj1)和synchronized(obj2)并不能实现互斥。[/color]packagecn.thread;publicclassThreadDieSockimplementsRunnable{privateintflag=1;privateObjectobj1=newObject(),obj2=newObject();publicvoidrun(){System.out.println("flag="+flag);if(flag==1){synchronized(obj1){System.out.println("我已经锁定obj1,休息0.5秒后锁定obj2去!");try{Thread.sleep(500);}catch(InterruptedExceptione){e.printStackTrace();}synchronized(obj2){System.out.println("1");}}}if(flag==0){synchronized(obj2){System.out.println("我已经锁定obj2,休息0.5秒后锁定obj1去!");try{Thread.sleep(500);}catch(InterruptedExceptione){e.printStackTrace();}synchronized(obj1){System.out.println("0");}}}}publicstaticvoidmain(String[]args){ThreadDieSockrun01=newThreadDieSock();ThreadDieSockrun02=newThreadDieSock();run01.flag=1;run02.flag=0;Threadthread01=newThread(run01);Threadthread02=newThread(run02);System.out.println("线程开始喽!");thread01.start();thread02.start();}}

解决方案

解决方案二:
两个线程,两把锁就有可能会列锁,
解决方案三:
你执行的结果是什么!System.out.println("1");和System.out.println("0");打印出来了吗!
解决方案四:
那两个obj,搞成static就能模拟出来了。否则确实锁不上。爱学习的人遇上烂书。。。
解决方案五:
按楼主贴的代码来说,肯定死锁不了的!若楼主所看的博客的代码也确实如此,那估计是人家有可能是写漏了static了,这里的obj1和obj2若设为static,这个代码就能死锁!质疑并实践,学到的就是自己的,赞!
解决方案六:
我也不懂求解
解决方案七:
我只说一句:楼主说的没错第二:这个博客贴代码居然没有通过测试,误人子弟
解决方案八:
楼主正确~
解决方案九:
死锁发生,是占用共同资源,不释放,实例变量每一个对象都有一个锁,静态变量整个类对象只有一个共同锁,会发生死锁
解决方案十:
你这个代码当然不会死锁、锁住的都不是同一个对象。。
解决方案十一:
Synchronized是同一时刻只能有一个对象获得锁.....你new了两个run,run01,run02,这两个对象是完全不相干的也就是run01里面的obj和run02里面的obj根本就是两块内存....不相干的...只要new一个ThreadDieSock对象new两个Thread...把flag=-1->static....run方法加一句flag++;可以了吧

时间: 2024-09-29 03:34:59

线程死锁的质疑的相关文章

java的线程死锁

由于线程可能进入堵塞状态,而且由于对象可能拥有"同步"方法--除非同步锁定被解除,否则线程不能访问那个对象--所以一个线程完全可能等候另一个对象,而另一个对象又在等候下一个对象,以此类推.这个"等候"链最可怕的情形就是进入封闭状态--最后那个对象等候的是第一个对象!此时,所有线程都会陷入无休止的相互等待状态,大家都动弹不得.我们将这种情况称为"死锁".尽管这种情况并非经常出现,但一旦碰到,程序的调试将变得异常艰难. 就语言本身来说,尚未直接提供防

多线程专题之线程死锁原因之谜

引子:线程死锁曾是多少程序员的噩梦,每每为此食不甘味,夜不成寐,一句话:苦不堪言.本文从几个场景入手,试图解开产生死锁的原因之谜. 教科书:说的很具体,理解很抽象 关于死锁产生的原因<操作系统>中有比较好的说明: (1)因为系统资源不足. (2)进程运行推进的顺序不合适. (3)资源分配不当等. 关于死锁出现的必要条件也有比较具体的说明: (1)互斥条件:一个资源每次只能被一个进程使用. (2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放. (3)不剥夺条件:进程已获得的

java 进程死锁-java 模拟线程死锁实验

问题描述 java 模拟线程死锁实验 我想两个线程一直在售票知道票卖光,但是用while()控制循环后出现 售票2进入共享区 当前没有车票可以出售! 售票2进入共享区 当前没有车票可以出售! 售票2进入共享区 ..... 具体代码如下 package com; public class SaleThread extends Thread{ private String name; ShareResource shareresource; public SaleThread(){} public

线程 死锁-一个关于线程挂起、唤醒的问题

问题描述 一个关于线程挂起.唤醒的问题 在windows平台上, 线程的挂起可以使用API SuspendThread()函数,而减少线程的挂起计数则可以使用ResumeThread()函数,但是今天却发现了其中隐藏的问题:1. 现有一个主线程和子线程A,在主线程中调用SuspengThread()使得A被挂起:2. 主线程中调用ResumeThread()使得A恢复运行:3. 主线程立刻调用SuspendThread()意图挂起A时,主线程竟然被阻塞在了调用处!也就是说产生了deadlock!

synchronized-Java的一个简单线程死锁问题

问题描述 Java的一个简单线程死锁问题 class BadPerson { public synchronized void say(GoodPerson good) { System.out.println(""把钱给我,放了你的人.""); good.give(); } public synchronized void give() { System.out.println(""得到了钱,同时被警察抓了.""); }}c

java模拟线程死锁

  /* java线程死锁的模拟 两个线程同时请求对方的对方释放监视对象 造成死锁 请在 虚拟机 单核下运行 */ class  Test  {  public static void main(String []args)  throws Exception    {      ThreadOne td=new ThreadOne();      new Thread(td).start();      Thread.sleep(3);      new Thread(td).start();

c#如何避免线程死锁

大多数的死锁都是因为代码允许以不一致的方式锁定资源.例如我们要将一个账户的资金转到另一个账户中.Monitor类提供同步对对象的访问的机制.类通过向单个线程授予对象锁来控制对对象的访问.对象锁提供限制访问代码块(通常称为临界区)的能力.当一个线程拥有对象的锁时,其他任何线程都不能获取该锁.还可以使用Monitor来确保不会允许其他任何线程访问正在由锁的所有者执行的应用程序代码节,除非另一个线程正在使用其他的锁定对象执行该代码.示例代码如下: public void Transer(Account

线程死锁问题

1.引言 5个哲学家的故事: 5个哲学家去吃饭,菜饭都上齐了,筷子也上了,但是一人只有一只筷子,每个人,先思考一会,把筷子借给别人,然后,别人吃完了,自己再吃.但是假如这5个人都饿了,他们就会拿起自己的筷子,而筷子只有一只,大家都在等待这个别人放下那一只筷子,然后好拿过来吃饭,而没有任何一个人愿意先放下筷子,所以,就出现了死锁. 所以,死锁就是两个线程都掌握着另一个线程下一步需要访问的资源,而两个线程却都不愿意放弃自己手中的资源而导致的线程阻塞. 2.死锁示例 代码详解放注释中: (1)创建两个

java 线程死锁

问题描述 publicvoidrun(){for(TlcLogStddelivertable:listTable){System.out.println("正在传送当前第"+DatatransfersBo.n+"条数据");System.out.println("手机号---------"+table.getVc2srcmobile());System.out.println("手机内容"+table.getVc2messag