线程的死锁
哲学家进餐的问题
线程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--;
}
}
}
}
... {
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--;
}
}
}
}