多线程之三

来源:互联网 发布:乎的反义词是什么 编辑:程序博客网 时间:2024/04/30 06:03

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

                                                     }

    }

}

 

原创粉丝点击