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

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

  

(单例设计模式中)懒汉式与饿汉式在多线程中的不同,布布扣,bubuko.com

时间: 2024-10-20 18:13:59

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

单例设计模式(懒汉式,饿汉式)

设计模式:解决问题的一种行之有效的思想 单例设计模式:保证了一个类在内存中只能有一个对象,比如多程序访问一个配置文件,希望多程序操作都是同一个配置文件中的数据,那么就需要保证该配置文件对象的唯一性. 思路:1.怎么做才能保证这个对象是唯一的呢?其他程序通过new创建该类对象时根本无法控制个数,那么,就不让其他程序创建该类的对象了,因为不可以控制.2.不让其他程序创建,就该在本类中自己创建一个对象.3.该类将创建的对象对外提供,让其他程序获取并使用. 步骤:1.怎么实现不让其他程序创建该类对象呢?

iOS-单例模式(懒汉式和饿汉式)和GCD实现

// // HMMusicTool.h // 03-单例模式-Singleton(掌握) // // Created by apple on 14-9-16. // Copyright (c) 2014年 heima. All rights reserved. // 播放音乐 #import <Foundation/Foundation.h> @interface HMMusicTool : NSObject + (instancetype)sharedMusicTool; @end // /

单例之懒汉式和饿汉式

所谓“懒汉式”与“饿汉式”的区别,是在与建立单例对象的时间的不同. “懒汉式”是在你真正用到的时候才去建这个单例对象: public class Singleton{ private Singleton(){} private static Singleton singleton = null: //不建立对象 public static synchronized Singleton getInstance(){ if(singleton == null) { //先判断是否为空 singlet

[转]设计模式--单例模式(一)懒汉式和饿汉式

单例模式是设计模式中比较简单的一种.适合于一个类只有一个实例的情况,比如窗口管理器,打印缓冲池和文件系统, 它们都是原型的例子.典型的情况是,那些对象的类型被遍及一个软件系统的不同对象访问,因此需要一个全局的访问 指针,这便是众所周知的单例模式的应用.当然这只有在你确信你不再需要任何多于一个的实例的情况下. 单例模式的用意在于前一段中所关心的.通过单例模式你可以: 一.确保一个类只有一个实例被建立 二.提供了一个对对象的全局访问指针 三.在不影响单例类的客户端的情况下允许将来有多个实例 经典的单

懒汉式和饿汉式

                           单例 (Singleton)设计模式 设计模式是在大量的实践中总结和理论化之后优选的代码结构.编程风格.以及解决问题的思考方式.设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱,免去我们自己再思考和摸索.      所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法.如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造方法的访问权限设置为p

单件模式详解:懒汉式与饿汉式

class Instance{} //懒汉式 class LSingle{ private static  Instance _instance = null; private LSingle(){} public static Instance getInstance(){ if(_instance==null){ synchronized(LSingle.class){ _instance = new Instance(); } } return _instance; } } //饿汉式 c

Java单例模式--------懒汉式和饿汉式

单件模式用途:单件模式属于工厂模式的特例,只是它不需要输入参数并且始终返回同一对象的引用.单件模式能够保证某一类型对象在系统中的唯一性,即某类在系统中只有一个实例.它的用途十分广泛,打个比方,我们开发了一个简单的留言板,用户的每一次留言都要将留言信息写入到数据库中,最直观的方法是没次写入都建立一个数据库的链接.这是个简单的方法,在不考虑并发的时候这也是个不错的选择.但实际上,一个网站是并发的,并且有可能是存在大量并发操作的.如果我们对每次写入都创建一个数据库连接,那么很容易的系统会出现瓶颈,系统

java软件设计模式——单例设计模式中的【饿汉式】与 【懒汉式】示例

以下为单例设计模式中的两种经典模式的代码示意: 1 单例设计模式(spring框架IOC,默认创建的对象都是单例的): 2 饿汉式: 3 public class SingleClass { 4 private SingleClass(){} //私有化构造方法 不能new对象 5 private static final SingleClass s=new SingleClass(); 6 //返回本类对象 7 public static SingleClass getInstance(){

单例设计模式之懒汉式(枚举实现)

package com.waibizi.demo07; @SuppressWarnings("all") public class Singleton_pattern { public static void main(String[] args) { // TODO Auto-generated method stub Singleton instance=Singleton.instance; Singleton instance1=Singleton.instance; Syst