线程的死锁
哲学家进餐的问题
线程1锁住了对象A的监视器,等待对象B的监视器,线程2锁住了对象B的监视器,等待对象A的监视器,就造成了死锁。
class TicketsSystem3

...{
public static void main(String[] args)

...{
SellThread st=new SellThread();
new Thread(st).start();
try

...{
Thread.sleep(1000);
}
catch(Exception e)

...{
e.printStackTrace();
}
st.b=true;
new Thread(st).start();
}
}
class SellThread implements Runnable

...{
int tickets=100;
Object ojb=new Object();//这个可以是任意的对象
boolean b=false;
public void run()

...{
if(b==false)

...{
while(true)

...{
sell();//同步方法利用的是this所代表的对象的锁
}
}
else

...{
while(true)

...{
synchronized(obj)

...{
try

...{
Thread.sleep(1000);
}
catch(Exception e)

...{
e.printStackTrace();
}
synchronized(this)//能实现方法和同步块同步

/** *//**静态方法只属于类本身,它并不属于某一个对象,当我们在调用静态方法的时候
并不需要产生类的对象,同步静态方法使用的是方法所在的类所对应的CLASS对象的监视器,
每个对象都有自己对应的CLASS对象*/
//synchronized(ojb)//这样的话。两个线程实现的都是ELSE里的语句,
//让线程睡眠一会可以看到结果会出现0这张票

...{
if(tickets>0)

...{
System.out.println("obj:"+Thread.currentThread().getName()+
" sell tickets:"+tickets);
tickets--;
}
}
}
}
}
}
public synchronized void sell()

...{
synchronize(obj)

...{
if(tickets>0)

/** *//**假设第一个线程进入IF语句中,时间片刚好到期,然后第二个线程运行,进入IF语句中
时间片刚好到期,然后第三个线程运行,进入IF语句中,时间片刚好到期
然后第四个线程运行,进入IF语句中,时间片刚好到期.之后,第一个线程获得时间片,
开始运行语句,开始减减,卖了1这张票,tickets变为0,第二个线程卖了0这张票,
tickets变为-1.第三个线程卖了-1这张票,tickets变为-2,第四个线程卖了-2这张票,tickets变为-3,
让线程睡眠一下,可以捕捉结果*/

...{
try

...{
Thread.sleep(1000);
}
catch(Exception e)

...{
e.printStackTrace();
}
System.out.println("sell:"+Thread.currentThread().getName()+
" sell tickets:"+tickets);
tickets--;
}
}
}
}