黑马程序员技术交流社区
标题:
关于死锁Thread里传的参数
[打印本页]
作者:
BitmapFactory
时间:
2013-3-14 10:19
标题:
关于死锁Thread里传的参数
本帖最后由 张学林 于 2013-3-14 16:10 编辑
/*写个死锁*/
class Test implements Runnable
{
private boolean flag;
Test(boolean flag)
{
this.flag = flag;
}
public void run()
{
if(flag)
{
while(true){
synchronized(MyLock.locka)
{
System.out.println("if locka");
synchronized(MyLock.lockb)
{
System.out.println("if lockb");
}
}}
}
else
{
while(true){
synchronized(MyLock.lockb)
{
System.out.println("else lockb");
synchronized(MyLock.locka)
{
System.out.println("else locka");
}
}}
}
}
}
class MyLock
{
static Object locka = new Object();
static Object lockb = new Object();
}
class DeadLockDemo
{
public static void main(String[] args)
{
Thread t1 = new Thread(new Test(true));//Test类又不是单例,这里不是创建了两个
Thread t2 = new Thread(new Test(false));//对象吗,为啥会有死锁呢,难道在线程里创建对象都是创建的同一个对象吗?
t1.start();
t2.start();
}
}
复制代码
在函数中Test类又不是单例,这里不是创建了两个对象吗,为啥会有死锁呢,难道在线程里创建对象都是创建的同一个对象吗?
作者:
王军行
时间:
2013-3-14 13:10
死锁:通常是同步中嵌套同步产生,理解了死锁出现的原因就明白了,
线程是创建了两个Thread t1 = new Thread(new Test(true));
Thread t2 = new Thread(new Test(false));
对象是两个new Test(false)和new Test(true)但是锁只有两个,locka和lockb因为class MyLock中这两个所都是静态的,静态的是所有对象共享数据。
不管几个对象。他们用的都是这两把锁,所以在嵌套同步中出现死锁
如果你把locka和lockb定义成非静态的,在Test中new个对象,用对象调用,就不会出现死锁了,因为这时是四个锁了,同时这两个线程也不是同步了,不满足同步条件了
同步的前提:
1.必须要有两个或以上的线程
2.必须是多个线程使用同一个锁
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2