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();
    	}
    }
    

      

  • 相关阅读:
    CSS3 target伪类简介
    不用position,让div垂直居中
    css3 在线编辑工具 连兼容都写好了
    a标签伪类的顺序
    oncopy和onpaste
    【leetcode】1523. Count Odd Numbers in an Interval Range
    【leetcode】1518. Water Bottles
    【leetcode】1514. Path with Maximum Probability
    【leetcode】1513. Number of Substrings With Only 1s
    【leetcode】1512. Number of Good Pairs
  • 原文地址:https://www.cnblogs.com/hujunzheng/p/3876539.html
Copyright © 2011-2022 走看看