- class TicketsSystem_deadLock
- {
- public static void main(String[] args)
- {
- //main线程开始跑,发送start消息让持有obj锁的Thread0线程就绪,
- //由于中途让main线程休息了200毫秒,所以Thread0线程开始跑,
- //main线程休息完200毫秒,开始让Thread1线程就绪,而后开跑,
- //由于Thread0线程未跑结束,并没有释放obj锁,所以导致Thread1
- //试图使用obj锁失败,从而导致同步死锁.
- //简单来说就是T0,T1共用1把锁,T0还没有使用完这把锁,T1想抢锁,2个人
- //就开始不跑别的事,开始互相抢锁.也就是2个人同步的时间片出现交集.
- //可让main线程休息足够长时间,让T0跑完,再让T1跑.
- SellThread6 st = new SellThread6();
- new Thread(st).start();
- try
- {
- Thread.sleep(200);
- }
- catch(Exception e)
- {
- e.printStackTrace();
- }
- st.b = true;
- new Thread(st).start();
- }
- }
- class SellThread6 implements Runnable
- {
- boolean b = false;
- int tickets=100;
- Object obj=new Object();
- public void run()
- {
- if(b==false)
- {
- while(true)
- {
- sellTicket();
- }
- }
- else
- {
- while(true)
- {
- synchronized(obj)
- {
- try
- {
- Thread.sleep(100);
- }
- catch(Exception e)
- {
- e.printStackTrace();
- }
- synchronized(this)
- {
- if(tickets>0)
- {
-
- System.out.println("obj:"+Thread.currentThread().getName()+" sell tickets:"+tickets);
- tickets--;
- }
- }
- }
- }
- }
- }
- public synchronized void sellTicket()
- {
- synchronized(obj)
- {
- if(tickets>0)
- {
- try
- {
- Thread.sleep(10);
- }
- catch(Exception e)
- {
- e.printStackTrace();
- }
- System.out.println("sell():"+Thread.currentThread().getName()+" sell tickets:"+tickets);
- tickets--;
- }
- }
- }
- }
复制代码 注释为对该死锁产生原因的理解,大家可以讨论下。 |
|