这是老毕的代码:
class Ticket2 implements Runnable{
Object obj=new Object();
private static int ticket=200;
boolean flag=true;
public void run(){
if(flag){
while(true){
synchronized(obj){ //1 这里上了一个obj的锁,意思线程过了这里obj的锁就锁死,即obj的状态被改为已锁状态
show(); //2 调用show方法
}
}
}
else{
while(true){
System.out.print("else+++");
show();
}
}
}
public synchronized void show(){ //3 this锁被改为已锁状态
synchronized(obj){ //4 这里的obj锁已经是已锁状态了,怎么能进去?也就是说,我的理解是,线程执行到这里已经把
if(ticket>0){ //自己给锁死了。。。。
try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"show--------"+ticket--);
}
}
}
}
public class DeadLockTest1 {
public static void main(String[]args){
Ticket2 tic=new Ticket2();
Thread t1=new Thread(tic);
Thread t2=new Thread(tic);
t1.start();
try{
Thread.sleep(10);}
catch(Exception e){}
tic.flag=false;
t2.start();
}
}
这是我的执行结果:
else+++Thread-0show--------200 //主线程被手动sleep,确定线程0先运行,flag为true,为什么线程0会走else分支?
Thread-1show--------199
else+++Thread-1show--------198
else+++Thread-1show--------197
else+++Thread-1show--------196
else+++Thread-0show--------195
Thread-0show--------194
Thread-0show--------193
Thread-0show--------192
Thread-0show--------191
Thread-1show--------190
else+++Thread-1show--------189
else+++Thread-1show--------188
else+++Thread-0show--------187
Thread-0show--------186
Thread-0show--------185
Thread-0show--------184
Thread-0show--------183
Thread-1show--------182
else+++Thread-1show--------181
else+++Thread-1show--------180
else+++Thread-1show--------179
else+++Thread-0show--------178
我的问题是:从第一条显示结果的出的疑问,主线程被手动sleep,确定线程0先运行,flag为true,为什么线程0会走else分支?
还有个问题已经在程序注释中表明,随着1234步奏走就能看懂。求大神解答,我脑子笨,现在已经把我自己给锁死了。。。
|