java中线程 问题 !! 求高手解答!!

问题描述

publicclassTestDeadLockimplementsRunnable{publicintflag=1;staticObjecto1=newObject(),o2=newObject();publicvoidrun(){System.out.println("flag="+flag);if(flag==1){synchronized(o1){try{Thread.sleep(500);}catch(Exceptione){e.printStackTrace();}synchronized(o2){System.out.println("o2DeadLock");}}}if(flag==0){synchronized(o2){try{Thread.sleep(500);}catch(Exceptione){e.printStackTrace();}synchronized(o1){System.out.println("o2DeadLock");}}}}publicstaticvoidmain(String[]args){TestDeadLocktest1=newTestDeadLock();TestDeadLocktest2=newTestDeadLock();test1.flag=1;test2.flag=0;Threadt1=newThread(test1);Threadt2=newThread(test2);t1.start();t2.start();}}为什么程序会死锁啊TestDeadLocktest1=newTestDeadLock();TestDeadLocktest2=newTestDeadLock();这两个new出来在内存中的分布是不是这样的啊

解决方案

解决方案二:
你可以假设test1和test2这两个对象启动的线程中的任何一个先得到执行机会,这里假设是test2启动的线程因为test2的flag被置为0,进入if(flag==0)的那个同步块,获得o2的锁,然后睡眠500ms,这么长的时候test1启动的线程早就获得执行的机会了,进入对应的同步块获得o1的锁,然后睡眠500ms~~过了500ms醒来,一个需要o1的锁才能继续往下执行,一个需要o2的锁才能继续往下执行,但各自此时都无法释放相应的锁给对方,就互相等待着,进入死锁~~~test1启动的线程先执行的话做类似分析~~
解决方案三:
2.同步块,示例代码如下:publicvoidmethod(SomeObjectso){synchronized(so){//…..}}这时,锁就是so这个对象,谁拿到这个锁谁就能够运行他所控制的那段代码。当有一个明确的对象作为锁时,就能够这样写程式,但当没有明确的对象作为锁,只是想让一段代码同步时,能够创建一个特别的instance变量(他得是个对象)来充当锁:
解决方案四:
该回复于2011-04-18 08:53:17被版主删除
解决方案五:
死锁,是因为相互需要,而这时又相互的制约住了。
解决方案六:
又是马士兵的教程
解决方案七:
因为这个里的两个object都是static,所以test1.o1就是test2.o1;test1.o2就是test2.o2。

时间: 2024-11-10 05:21:35

java中线程 问题 !! 求高手解答!!的相关文章

C# mapx 始终无法将图元添加至新建图层中,急求高手解答!!!

问题描述 代码如下:MapXLib.Fieldsflds=newMapXLib.FieldsClass;MapXLib.Layerlyr=axMap1.Layers._Item(1);MapXLib.Datasetdts,dts_red=null;MapXLib.Featuresftrs,ftrs_clone;MapXLib.Featureftr;flds.Add("ID","ID",MapXLib.AggregationFunctionConstants.miAg

关于weblogic 线程中出现cpu线程过高dump文件,求高手解答

问题描述 关于weblogic 线程中出现cpu线程过高dump文件,求高手解答 "[ACTIVE] ExecuteThread: '894' for queue: 'weblogic.kernel.Default (self-tuning)'" id=914 idx=0xe4c tid=15267 prio=5 alive, parked, native_blocked, daemon at jrockit/vm/Locks.park0(J)V(Native Method) at j

char-java中参数传递变换的问题,求问:结果为什么是这样的啊??求高手解答!拜谢~

问题描述 java中参数传递变换的问题,求问:结果为什么是这样的啊??求高手解答!拜谢~ 求问:结果为什么是这样的啊?? change:Test change:g change:b change:c TestPram:Hello TestPram:g TestPram:b TestPram:c 代码如下: public class TestPram { String str = "Hello"; char[] ch = {'a','b','c'}; public static void

java 调用windows api 问题 求高手解答

问题描述 用java调用windowsapi能否体现调用接口过程,能否查看数据在内存中变换过程???求高手解答!!!!

c# sting byte byte-c#中,string转byte的几个问题,求高手解答!

问题描述 c#中,string转byte的几个问题,求高手解答! 注意哦,是byte 而不是byte[]; string nameStr = textBox_name.Text.ToString(); byte[] buffer = System.Text.Encoding.Default.GetBytes(nameStr); ----上述是string转byte[] 但是byte 到 short.ushort.int.uint.long.ulong.float.double 或 decimal

竖线-求高手解答:vc2008中鼠标选中一个对象后跳出一些东西,如图

问题描述 求高手解答:vc2008中鼠标选中一个对象后跳出一些东西,如图 那些东东是什么,竖线后面的数值又是什么,指针.地址.内容等等?改变数值会发生什么,如图 解决方案 就是这个对象的成员数据信息,各种指针地址等 解决方案二: 就是对象的成员,特别的,一些成员是结构体的指针,指针为null,没有分配空间,所以无法进一步获取它的成员,就是问号了.

内存表-求高手解答,ORACLE 12C 中新加功能InMemory疑问

问题描述 求高手解答,ORACLE 12C 中新加功能InMemory疑问 在SQLPLUS中设置完一些表为InMemory之后,后面进行维护时,有没有方法可以获取到哪些表为InMemory表 我测试重复设置InMemory和no InMemory,SQLPLUS中也不会有错误信息 SQL> alter table test no inmemory; Table altered. SQL> alter table test no inmemory; Table altered. SQL>

spring 报错,求高手解答

问题描述 spring 报错,求高手解答 代码: package com.test.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annota

异常-问题如下,求高手解答,谢谢

问题描述 问题如下,求高手解答,谢谢 代码如下: //并发图片上传import java.io.*;import java.net.*; class PicClient2{ public static void main(String[] args) throws Exception { Socket s = new Socket(InetAddress.getByName(""localhost"")11111); BufferedInputStream bufi