首页 > 代码库 > (单例设计模式中)懒汉式与饿汉式在多线程中的不同

(单例设计模式中)懒汉式与饿汉式在多线程中的不同

/* 目的:分析一下单例设计模式中,懒汉式与饿汉式在多线程中的不同! 开发时我们一般选择饿汉式,因为它简单明了,多线程中不会出现安全问题! 而饿汉式需要我们自己处理程序中存在的安全隐患,但是饿汉式的程序技术含量更高!*//* class SinglePerson implements Runnable{   private static SinglePerson ss = new SinglePerson("hjz", 22);//恶汉式   private int age;   private String name;   private int count;   private SinglePerson(String name, int age){      this.age = age;	  this.name = name;   }   private SinglePerson(){      age = 10;	  name = " ";   }   public static SinglePerson getInstance(){      return ss;   }   public String getName(){      return name;   }   public int getAge(){      return age;   }      public void setIntroduceCount(){      ++count;   }      public int getIntroduceCount(){      return count;   }      public synchronized void run(){		ss.setIntroduceCount();		try{		   Thread.sleep(20);		}catch(InterruptedException e){		   		}	    System.out.println("this is " + ss.getName() + " " + ss.getAge() + " 被介绍的次数是:" + ss.getIntroduceCount());	}   }  */ class SinglePerson implements Runnable{   private static SinglePerson ss = null;//懒汉式   private int age;   private String name;   private int count;   private SinglePerson(String name, int age){      this.age = age;	  this.name = name;	  count=0;   }   private SinglePerson(){      age = 10;	  name = " ";   }   /*public static SinglePerson getInstance(){      if(ss==null){//单例设计模式中,懒汉式在多线程中的缺憾啊!可能不能保证对象的唯一性		      try{			     Thread.sleep(10);			  }catch(InterruptedException e){}		      ss = new SinglePerson("hjz", 22);	  }      return ss;   }*/      /* public static synchronized SinglePerson getInstance(){//保证了对象的唯一性,也就是安全性保证了!但是每当调用该函数时      if(ss==null){               //都要判断一下同步锁对象,降低了程序的效率!		      try{			     Thread.sleep(10);			  }catch(InterruptedException e){}		      ss = new SinglePerson("hjz", 22);	  }      return ss;   } */      public static SinglePerson getInstance(){//这就是懒汉式的安全又效率的代码!       if(ss==null){//这一句是必须判断的!	      synchronized(SinglePerson.class){//这一句只是其他的线程访问时判断			  if(ss==null){					  try{						 Thread.sleep(10);					  }catch(InterruptedException e){}					  ss = new SinglePerson("hjz", 22);			  }		  }	  }      return ss;   }      public String getName(){      return name;   }   public int getAge(){      return age;   }      public void setIntroduceCount(){      ++count;   }      public int getIntroduceCount(){      return count;   }      public synchronized void run(){		ss.setIntroduceCount();	    System.out.println("this is " + ss.getName() + " " + ss.getAge() + " 被介绍的次数是:" + ss.getIntroduceCount());	}}class OtherThread extends Thread{    public void run(){	    SinglePerson.getInstance().run();	}}public class Test{    public static void main(String[] args){	      new OtherThread().start();	      new OtherThread().start();	      new OtherThread().start();	      new Thread(SinglePerson.getInstance()).start();	}}