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

简介:

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

目录
相关文章
|
28天前
|
设计模式 存储 安全
设计模式——设计模式介绍和单例设计模式
饿汉式(静态常量)、饿汉式(静态代码块)、懒汉式(线程不安全)、懒汉式(线程安全,同步方法)、懒汉式(线程不安全,同步代码块)、双重检查(推荐,线程安全、懒加载)、静态内部类(推荐)、枚举(推荐)
设计模式——设计模式介绍和单例设计模式
|
2月前
|
设计模式 JavaScript 前端开发
从工厂到单例再到策略:Vue.js高效应用JavaScript设计模式
【8月更文挑战第30天】在现代Web开发中,结合使用JavaScript设计模式与框架如Vue.js能显著提升代码质量和项目的可维护性。本文探讨了常见JavaScript设计模式及其在Vue.js中的应用。通过具体示例介绍了工厂模式、单例模式和策略模式的应用场景及其实现方法。例如,工厂模式通过`NavFactory`根据用户角色动态创建不同的导航栏组件;单例模式则通过全局事件总线`eventBus`实现跨组件通信;策略模式用于处理不同的表单验证规则。这些设计模式的应用不仅提高了代码的复用性和灵活性,还增强了Vue应用的整体质量。
30 0
|
2月前
|
设计模式 Java
【Java】单例设计模式
【Java】单例设计模式
|
3月前
|
设计模式 存储 缓存
Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
43 0
|
3月前
|
设计模式 缓存 安全
Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
33 0
|
3月前
|
设计模式 并行计算 安全
Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
42 0
|
3月前
|
设计模式 安全 Java
Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
85 0
|
13天前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
21天前
|
Java Spring
spring多线程实现+合理设置最大线程数和核心线程数
本文介绍了手动设置线程池时的最大线程数和核心线程数配置方法,建议根据CPU核数及程序类型(CPU密集型或IO密集型)来合理设定。对于IO密集型,核心线程数设为CPU核数的两倍;CPU密集型则设为CPU核数加一。此外,还讨论了`maxPoolSize`、`keepAliveTime`、`allowCoreThreadTimeout`和`queueCapacity`等参数的设置策略,以确保线程池高效稳定运行。
88 10
spring多线程实现+合理设置最大线程数和核心线程数
|
1月前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android多线程编程的重要性及其实现方法,涵盖了基本概念、常见线程类型(如主线程、工作线程)以及多种多线程实现方式(如`Thread`、`HandlerThread`、`Executors`、Kotlin协程等)。通过合理的多线程管理,可大幅提升应用性能和用户体验。
55 15
一个Android App最少有几个线程?实现多线程的方式有哪些?