同步与死锁

以卖车票为例:

class SyThread implements Runnable{
 private int ticket = 5;
 
 @Override
 public void run() {
  //for(int i=5; i>0; i--)
  for(int i=0; i <100; i++){
   if(ticket >0){
    try {
     Thread.sleep(500);
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    System.out.println("卖出票数为:"+ticket--);
   }
  }
  }
 }
}
 

public class SynchronizedDemo01 {
 public static void main(String[] args) {
  SyThread st = new SyThread();
  Thread mt1 = new Thread(st);
  Thread mt2 = new Thread(st);
  Thread mt3 = new Thread(st);
  mt1.start();
  mt2.start();
  mt3.start();

 }

 

卖出票数为:5
卖出票数为:5
卖出票数为:4
卖出票数为:3
卖出票数为:2
卖出票数为:1
卖出票数为:-1
卖出票数为:0


上述程序说明在资源共享的情况下如果不让各线程同步,会造成结果出现异常的情况;在这个卖票的系统中票数出现的负数的情况;

需要注意的是:
 用Thread类的时候,如果要让线程休眠,那么需要加上捕获异常;
 对于同一个类,可以有多个线程进行同时使用,这就是多线程;

class SyThread implements Runnable{
 private int ticket = 5;
 
 @Override
 public void run() {
  //for(int i=5; i>0; i--)
  for(int i=0; i <100; i++){
   synchronized(this){ //加上synchronized关键字的目的是让线程在使用资源的时候判断有没有其它的线程正在使用资源
   if(ticket >0){
    try {
     Thread.sleep(500);
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
    System.out.println("卖出票数为:"+ticket--);
   }
  }
  }
 }
}
 

public class SynchronizedDemo01 {
 public static void main(String[] args) {
  SyThread st = new SyThread();
  Thread mt1 = new Thread(st);
  Thread mt2 = new Thread(st);
  Thread mt3 = new Thread(st);
  mt1.start();
  mt2.start();
  mt3.start();

 }
}
运行结果:
卖出票数为:5
卖出票数为:4
卖出票数为:3
卖出票数为:2
卖出票数为:1


加上synchronized关键字的目的是让线程在使用资源的时候判断有没有其它的线程正在使用资源


如果使用太多的线程同步,则可能会造成死锁
死锁的意思就是说:
甲想要乙的书,乙想要甲的画;
甲对乙说:你给我你的书,我就把画给你;
乙对甲说:你给我你的画,我就把书给你;
结果双方都因为对方没有主动给你,而在那里等待着,这就是程序的死锁;

 

 


 

 

posted @ 2013-08-02 22:37  peng_gy  阅读(76)  评论(0编辑  收藏  举报