A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 何明辉 于 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运行的代码快是一样的吗。如果是这样理解的话会不会出现不是死锁的情况啊。

2 个回复

倒序浏览
本帖最后由 杨震 于 2012-9-9 11:56 编辑

首先你讲的很对,你说的情况是存在的,两线程要执行不同的代码,针对你说的,你可以在flag=false之前换让主线暂停,让第一个线程先运行,然后让第二个线程运行,这时两个线程起动时flag就不同了,执行代码也不一样.

回复 使用道具 举报
本帖最后由 杨震 于 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();
}
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马