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

简介:
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,如需转载请自行联系原作者
目录
相关文章
|
30天前
|
设计模式 安全 测试技术
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
【C/C++ 设计模式 单例】单例模式的选择策略:何时使用,何时避免
61 0
|
1月前
|
设计模式 缓存 安全
单例设计模式的优缺点
单例设计模式的优缺点
31 0
|
1月前
|
设计模式 XML 存储
关于 ABAP 单例设计模式的一个冷门知识点
关于 ABAP 单例设计模式的一个冷门知识点
22 0
|
1月前
|
设计模式 安全 Java
【设计模式】2、设计模式分类和单例设计模式
【设计模式】2、设计模式分类和单例设计模式
25 0
|
26天前
|
设计模式 安全 Java
在Java中即指单例设计模式
在Java中即指单例设计模式
18 0
|
15天前
|
存储 Java 数据库连接
java多线程之线程通信
java多线程之线程通信
|
26天前
|
存储 缓存 NoSQL
Redis单线程已经很快了6.0引入多线程
Redis单线程已经很快了6.0引入多线程
31 3
|
29天前
|
消息中间件 安全 Linux
线程同步与IPC:单进程多线程环境下的选择与权衡
线程同步与IPC:单进程多线程环境下的选择与权衡
58 0
|
1月前
|
Java 调度 C#
C#学习系列相关之多线程(一)----常用多线程方法总结
C#学习系列相关之多线程(一)----常用多线程方法总结
|
1月前
|
安全 编译器 C#
C#学习相关系列之多线程---lock线程锁的用法
C#学习相关系列之多线程---lock线程锁的用法