class Lie
{
public static void main(String[] args)
{
Dear d=new Dear();
new Thread(d).start();
try
{
Thread.sleep(1);
}
catch(Exception e)
{
e.printStackTrace();
}
d.b=true;
new Thread(d).start();
}
}class Dear implements Runnable
{
int i=180;
Object obj=new Object();
Boolean b=false;
public void run()
{
if(b==false)
{
while(true)
sun();
}
else
{
while(true)
{
synchronized(obj)
{
try
{
Thread.sleep(10);
}
catch(Exception e)
{
e.printStackTrace();
}
synchronized(this)
{
if(i>0)
{
System.out.println("run this:"+Thread.currentThread().getName()+
"i:"+i);
i--;
}
}
}
}
}
}
public synchronized void sun()
{
synchronized(obj)
{
if(i>0)
{
try
{
Thread.sleep(10);
}
catch(Exception e)
{
e.printStackTrace();
}
System.out.println("sun is:"+Thread.currentThread().getName()+
"i:"+i);
i--;
}
}
}
} 始终不明白,检查了好几遍,头疼,请高手指点。。threadclass
{
public static void main(String[] args)
{
Dear d=new Dear();
new Thread(d).start();
try
{
Thread.sleep(1);
}
catch(Exception e)
{
e.printStackTrace();
}
d.b=true;
new Thread(d).start();
}
}class Dear implements Runnable
{
int i=180;
Object obj=new Object();
Boolean b=false;
public void run()
{
if(b==false)
{
while(true)
sun();
}
else
{
while(true)
{
synchronized(obj)
{
try
{
Thread.sleep(10);
}
catch(Exception e)
{
e.printStackTrace();
}
synchronized(this)
{
if(i>0)
{
System.out.println("run this:"+Thread.currentThread().getName()+
"i:"+i);
i--;
}
}
}
}
}
}
public synchronized void sun()
{
synchronized(obj)
{
if(i>0)
{
try
{
Thread.sleep(10);
}
catch(Exception e)
{
e.printStackTrace();
}
System.out.println("sun is:"+Thread.currentThread().getName()+
"i:"+i);
i--;
}
}
}
} 始终不明白,检查了好几遍,头疼,请高手指点。。threadclass
死锁:通常发生在,同步中嵌套同步,而锁不一样。class DeadLock implements Runnable
{
private boolean flag;
DeadLock(boolean flag)
{
this.flag = flag;
}
public void run()
{
if(flag)
{
while(true)
{
synchronized(MyLock.locka)
{
sop(Thread.currentThread().getName()+"..if locka");
synchronized(MyLock.lockb)
{
sop(Thread.currentThread().getName()+"...if locka");
}
}
}
}
else
{
while(true)
{
synchronized(MyLock.lockb)
{
sop(Thread.currentThread().getName()+"...else lockb");
synchronized(MyLock.locka)
{
sop(Thread.currentThread().getName()+"...else locka");
}
}
}
}
} public void sop(Object obj)
{
System.out.println(obj);
}
}class MyLock
{
static Object locka = new Object();
static Object lockb = new Object();
}class DeadLockDemo
{
public static void main(String[] args)
{
new Thread(new DeadLock(true)).start();
new Thread(new DeadLock(false)).start();
}
}
System.out.println("sun is:"+Thread.currentThread().getName()+
我想问下这代码是怎么弄上去的
public synchronized void sun()
{
try
{
Thread.sleep(10);
}
catch(Exception e)
{
e.printStackTrace();
}
synchronized(obj)
{
System.out.println("go to sun b=false");
if(i>0)
{
System.out.println("sun is:"+Thread.currentThread().getName()+
"i:"+i);
i--;
}
}
}
现在来分析下你的疑问,为什么还能循环。我把你程序打印的结果列出来,当然是随即。每次结果不一样。
sun is:Thread-0i:180
sun is:Thread-0i:179
sun is:Thread-0i:178
sun is:Thread-0i:177
sun is:Thread-0i:176
sun is:Thread-0i:175
sun is:Thread-0i:174
sun is:Thread-0i:173
sun is:Thread-0i:172
比方说第一线程(A),默认b==false。第二个线程(B),b==true。
A先执行,走到方法sun中,因为加了synchronized,就是得到this锁,然后执行下面的synchronized(obj)语句,这个时候有占用了obj锁,死锁的临界区就在下面的C位置。要产生死锁,就得在A要执行C语句块以下的代码的时候,线程B同时进入了run方法中else语句,并且获得了obj锁,B接着申请this锁。this锁又被A占用了,A又在申请obj锁。大家都在等,那就一起等死吧。
public synchronized void sun()
//死锁临界区间(C)
{
synchronized(obj)。
由于C中没有任何时间间隔,所以A就同时占有了两把锁,这个时候线程B 没机会执行run方法中的else语句,因为它一直在等待obj锁的释放。线程A接着执行,打出sun is:Thread-0i:180。 执行完后线程A要释放锁object,this。这个时候返回到while(true) sun();处。其实我的理解这个时候A,B都有机会执行相应的代码块,但是根据程序打印的结果,接着A线程会继续执行,这样就重复上面的代码,至于什么时候结束,就是上面提到的临界区,产生死锁了,程序就死在那里了。这样看来你的代码其实是产生了死锁,只是时间比较慢。我上面该的代码就是让他死得更块点。呵呵,纯属个人见解,希望对你有帮助。另外,可以给你点意见,多加些 log,这样对你分析程序有帮助。