5黑马币
视频138中讲到一个例子,为了验证同步函数的锁是this使用了以下代码
class Ticket implements Runnable// extends Thread
{
private int tick = 1000;
Object obj = new Object();
boolean flag = true;
public void run()
{
if (flag) //当flag=true时,线程执行同步代码块
while(true)
{
synchronized(obj)
{
if (tick>0)
{
try{Thread.sleep(10);}catch(Exception e){}//强制线程睡眠,使运行出现溢出错误
System.out.println(Thread.currentThread().getName()+" ...code...:"+tick--);
}
}
}
else //当flag=false时,线程执行同步函数
while (true)
{
show();
}
}
public synchronized void show()
{
if (tick>0)
{
try{Thread.sleep(10);}catch(Exception e){}//强制线程睡眠,使运行出现溢出错误
System.out.println(Thread.currentThread().getName()+" ...show:"+tick--);
}
}
}
class ThisLockDemo
{
public static void main(String[] args)
{
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.start();
t.flag = false; //切换flag为false
try{Thread.sleep(10);}catch(Exception e){}
t2.start();
}
}
结果如上图,大致就是让两个线程各自运行run()方法中flag=true与flag=false的部分。
我的疑惑就是,为什么thread-0能一直运行flag=true时的同步代码块?如果thread-1已经运行了,代表flag已经被改为false了吧,那么thread-0再运行run()方法时应该也运行false的部分啊?还是我哪里理解错了……实在有些晕了,希望大家不吝赐教
|
|