黑马程序员技术交流社区
标题:
关于死锁中的标志位flag可不可以这样理解
[打印本页]
作者:
何明辉
时间:
2012-9-9 11:19
标题:
关于死锁中的标志位flag可不可以这样理解
本帖最后由 何明辉 于 2012-9-9 12:44 编辑
class Synch implements Runnable
{
private int x=100;
Object obj=new Object();
public boolean flag=true;
public void run()
{
if(flag)
while(true)
{
synchronized(obj)
{
show();
}
}
else
while(true)
show();
}
public synchronized void show()
{
synchronized(obj)
{
if(x>0)System.out.println(Thread.currentThread().getName()+"....."+x--);
}
}
}
class SynchDemo
{
public static void main(String[] args)
{
Synch sh=new Synch();
Thread t1=new Thread(sh);
Thread t2=new Thread(sh);
t1.start();
sh.flag=false;
//这里通过控制标志位来实现线程运行两段不同的代码。
t2.start();
}
}
这是死锁的典型写法。但是会不会出现这样的情况了:当主线程执行到t1.start()的时候,t1线程它没有立即抢到cpu的执行权,此时主线程就读取了标志位,那么在当t1在去运行的时候不就和t2运行的代码快是一样的吗。如果是这样理解的话会不会出现不是死锁的情况啊。
作者:
杨震
时间:
2012-9-9 11:51
本帖最后由 杨震 于 2012-9-9 11:56 编辑
首先你讲的很对,你说的情况是存在的,两线程要执行不同的代码,针对你说的,你可以在flag=false之前换让主线暂停,让第一个线程先运行,然后让第二个线程运行,这时两个线程起动时flag就不同了,执行代码也不一样.
作者:
杨震
时间:
2012-9-9 11:52
本帖最后由 杨震 于 2012-9-9 12:07 编辑
class Synch implements Runnable
{
private int x=100;
Object obj=new Object();
public boolean flag=true;
public void run()
{
if(flag)
while(true)
{
synchronized(obj)
{
show();
}
}
else
while(true)
show();
}
public synchronized void show()
{
synchronized(obj)
{
if(x>0)System.out.println(Thread.currentThread().getName()+"....."+x--);
}
}
}
class SynchDemo
{
public static void main(String[] args)
{
Synch sh=new Synch();
Thread t1=new Thread(sh);
Thread t2=new Thread(sh);
t1.start();
Thread.sleep(100);//这里让主线程暂停一会,这时t1会运行,此时flag为true;然后到t2运行时,flag已经为false,这时两个线程就执行了不同的代码,就会死锁;如果没有这个暂停,你讲的那种情况是存在的
sh.flag=false; //这里通过控制标志位来实现线程运行两段不同的代码。
t2.start();
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2