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

简介:
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,如需转载请自行联系原作者
目录
相关文章
|
28天前
|
设计模式 存储 安全
设计模式——设计模式介绍和单例设计模式
饿汉式(静态常量)、饿汉式(静态代码块)、懒汉式(线程不安全)、懒汉式(线程安全,同步方法)、懒汉式(线程不安全,同步代码块)、双重检查(推荐,线程安全、懒加载)、静态内部类(推荐)、枚举(推荐)
设计模式——设计模式介绍和单例设计模式
|
2月前
|
设计模式 JavaScript 前端开发
从工厂到单例再到策略:Vue.js高效应用JavaScript设计模式
【8月更文挑战第30天】在现代Web开发中,结合使用JavaScript设计模式与框架如Vue.js能显著提升代码质量和项目的可维护性。本文探讨了常见JavaScript设计模式及其在Vue.js中的应用。通过具体示例介绍了工厂模式、单例模式和策略模式的应用场景及其实现方法。例如,工厂模式通过`NavFactory`根据用户角色动态创建不同的导航栏组件;单例模式则通过全局事件总线`eventBus`实现跨组件通信;策略模式用于处理不同的表单验证规则。这些设计模式的应用不仅提高了代码的复用性和灵活性,还增强了Vue应用的整体质量。
30 0
|
2月前
|
安全 Java C#
Spring创建的单例对象,存在线程安全问题吗?
Spring框架提供了多种Bean作用域,包括单例(Singleton)、原型(Prototype)、请求(Request)、会话(Session)、全局会话(GlobalSession)等。单例是默认作用域,保证每个Spring容器中只有一个Bean实例;原型作用域则每次请求都会创建一个新的Bean实例;请求和会话作用域分别与HTTP请求和会话绑定,在Web应用中有效。 单例Bean在多线程环境中可能面临线程安全问题,Spring容器虽然确保Bean的创建过程是线程安全的,但Bean的使用安全性需开发者自行保证。保持Bean无状态是最简单的线程安全策略;
|
2月前
|
设计模式 Java
【Java】单例设计模式
【Java】单例设计模式
|
2月前
|
设计模式 SQL 安全
单例模式大全:细说七种线程安全的Java单例实现,及数种打破单例的手段!
设计模式,这是编程中的灵魂,用好不同的设计模式,能使你的代码更优雅/健壮、维护性更强、灵活性更高,而众多设计模式中最出名、最广为人知的就是Singleton Pattern单例模式。通过单例模式,我们就可以避免由于多个实例的创建和销毁带来的额外开销,本文就来一起聊聊单例模式。
|
3月前
|
设计模式 存储 缓存
Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
43 0
|
3月前
|
设计模式 缓存 安全
Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
33 0
|
14天前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
28天前
|
设计模式 算法 安全
设计模式——模板模式
模板方法模式、钩子方法、Spring源码AbstractApplicationContext类用到的模板方法
设计模式——模板模式
|
21天前
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。