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

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









本文转自 小眼儿 博客园博客,原文链接:http://www.cnblogs.com/hujunzheng/p/3876539.html,如需转载请自行联系原作者
目录
相关文章
|
设计模式 缓存 安全
「全网最细 + 实战源码案例」设计模式——单例设计模式
单例模式是一种创建型设计模式,确保一个类在整个程序运行期间只有一个实例,并提供一个全局访问点来获取该实例。它常用于控制共享资源的访问,如数据库连接、配置管理等。实现方式包括饿汉式(类加载时初始化)、懒汉式(延迟加载)、双重检查锁、静态内部类和枚举单例等。其中,枚举单例最简单且安全,能有效防止反射和序列化破坏。
435 7
|
设计模式 存储 安全
设计模式——设计模式介绍和单例设计模式
饿汉式(静态常量)、饿汉式(静态代码块)、懒汉式(线程不安全)、懒汉式(线程安全,同步方法)、懒汉式(线程不安全,同步代码块)、双重检查(推荐,线程安全、懒加载)、静态内部类(推荐)、枚举(推荐)
设计模式——设计模式介绍和单例设计模式
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
314 2
|
设计模式 JavaScript 前端开发
从工厂到单例再到策略:Vue.js高效应用JavaScript设计模式
【8月更文挑战第30天】在现代Web开发中,结合使用JavaScript设计模式与框架如Vue.js能显著提升代码质量和项目的可维护性。本文探讨了常见JavaScript设计模式及其在Vue.js中的应用。通过具体示例介绍了工厂模式、单例模式和策略模式的应用场景及其实现方法。例如,工厂模式通过`NavFactory`根据用户角色动态创建不同的导航栏组件;单例模式则通过全局事件总线`eventBus`实现跨组件通信;策略模式用于处理不同的表单验证规则。这些设计模式的应用不仅提高了代码的复用性和灵活性,还增强了Vue应用的整体质量。
475 1
|
安全 Java C#
Spring创建的单例对象,存在线程安全问题吗?
Spring框架提供了多种Bean作用域,包括单例(Singleton)、原型(Prototype)、请求(Request)、会话(Session)、全局会话(GlobalSession)等。单例是默认作用域,保证每个Spring容器中只有一个Bean实例;原型作用域则每次请求都会创建一个新的Bean实例;请求和会话作用域分别与HTTP请求和会话绑定,在Web应用中有效。 单例Bean在多线程环境中可能面临线程安全问题,Spring容器虽然确保Bean的创建过程是线程安全的,但Bean的使用安全性需开发者自行保证。保持Bean无状态是最简单的线程安全策略;
556 0
|
设计模式 Java
【Java】单例设计模式
【Java】单例设计模式
115 0
|
设计模式 Java 数据库连接
【设计模式】【创建型模式】工厂方法模式(Factory Methods)
一、入门 什么是工厂方法模式? 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法模式使类的实例化延迟
387 16
|
设计模式 负载均衡 监控
并发设计模式实战系列(2):领导者/追随者模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第二章领导者/追随者(Leader/Followers)模式,废话不多说直接开始~
383 0
|
设计模式 监控 Java
并发设计模式实战系列(1):半同步/半异步模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第一章半同步/半异步(Half-Sync/Half-Async)模式,废话不多说直接开始~
555 0
|
设计模式 安全 Java
并发设计模式实战系列(12):不变模式(Immutable Object)
🌟 大家好,我是摘星!🌟今天为大家带来的是并发设计模式实战系列,第十二章,废话不多说直接开始~
317 0

热门文章

最新文章