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

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

  

目录
相关文章
|
4月前
单列模式【饿汉式和懒汉式】
单列模式【饿汉式和懒汉式】
35 0
|
9月前
|
设计模式 安全 Java
单例模式:饿汉模式、懒汉模式
单例模式:饿汉模式、懒汉模式
128 0
|
5月前
|
安全 Java 关系型数据库
单例模式下引发的线程安全问题
单例模式确保类在进程中仅有一个实例,适用于如数据库连接等场景。分为饿汉式与懒汉式:饿汉式在类加载时创建实例,简单但可能浪费资源;懒汉式延迟创建实例,需注意线程安全问题,常采用双重检查锁定(Double-Checked Locking)模式,并使用 `volatile` 关键字避免指令重排序导致的问题。
92 2
单例模式下引发的线程安全问题
|
9月前
|
SQL 安全 Java
懒汉式单例的3个坑
懒汉式单例的3个坑
|
9月前
|
缓存 安全 Java
单例模式中的线程安全问题
单例模式中的线程安全问题
95 0
单例模式中的线程安全问题
|
9月前
|
安全 Java 编译器
单例模式之饿汉模式&懒汉模式
单例模式之饿汉模式&懒汉模式
|
9月前
|
设计模式 安全 Java
【单例模式】饿汉式,懒汉式?JAVA如何实现单例?线程安全吗?
【单例模式】饿汉式,懒汉式?JAVA如何实现单例?线程安全吗?
84 0
|
安全
线程安全的单例懒汉式
线程安全的单例懒汉式
53 0
单例模式(懒汉和饿汉)——独生子女挺好
单例模式(懒汉和饿汉)——独生子女挺好
|
设计模式 安全 Java
Java多线程案例-单例模式【饿汉模式,懒汉模式】
Java多线程案例-单例模式【饿汉模式,懒汉模式】
Java多线程案例-单例模式【饿汉模式,懒汉模式】