zoukankan      html  css  js  c++  java
  • (单例设计模式中)懒汉式与饿汉式在多线程中的不同

    /*
     目的:分析一下单例设计模式中,懒汉式与饿汉式在多线程中的不同!
     开发时我们一般选择饿汉式,因为它简单明了,多线程中不会出现安全问题!
     而饿汉式需要我们自己处理程序中存在的安全隐患,但是饿汉式的程序技术含量更高!
    */
    /* 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();
    	}
    }
    

      

  • 相关阅读:
    Beta 冲刺(1/7)
    福大软工 · BETA 版冲刺前准备(团队)
    福大软工 · 第十一次作业
    Alpha 冲刺 (8/10)
    Alpha 冲刺 (7/10)
    Alpha 冲刺 (6/10)
    个人作业——软件工程实践总结作业
    Beta 答辩总结
    Beta 冲刺 (7/7)
    Beta 冲刺 (6/7)
  • 原文地址:https://www.cnblogs.com/hujunzheng/p/3876539.html
Copyright © 2011-2022 走看看