打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
多线程下的单例模式
  • 在多线程下,单例是否仍能实现?
单例从概念上讲: 一个JVM里,只能有一个实例
多线程,仍旧是基于同一进程下,自然也是基于同一JVM下,因此符合单例的概念.


  • 我们可以按两种多线程方式分别进行测试分析:
1.多实例多线程
单例类:
public class MySingleton1 {
    private static final MySingleton1 instance =new MySingleton1();
    
    private MySingleton1(){}
    
    public static MySingleton1 getInstance() {
        return instance;
    }
 }
线程类:run()方法里面调用单例
    public void run(){
        MySingleton1 mySingleton1=null;
        mySingleton1 = MySingleton1.getInstance();
        System.out.println(mySingleton1+":"+mySingleton1.hashCode());
    }
测试代码:起10个线程,每个线程都是一个单独的实例    
        for(int i=0;i<10;i++){            
            Thread t = new Thread(new MyThread(),String.valueOf(i));
            t.start();
            }
看结果: 证明多线程多实例下,获取的确实是同一实例
com.machome.singleton.MySingleton1@ca0b6:827574
com.machome.singleton.MySingleton1@ca0b6:827574
com.machome.singleton.MySingleton1@ca0b6:827574
com.machome.singleton.MySingleton1@ca0b6:827574
com.machome.singleton.MySingleton1@ca0b6:827574
com.machome.singleton.MySingleton1@ca0b6:827574
com.machome.singleton.MySingleton1@ca0b6:827574
com.machome.singleton.MySingleton1@ca0b6:827574
com.machome.singleton.MySingleton1@ca0b6:827574
com.machome.singleton.MySingleton1@ca0b6:827574

2.单实例多线程
单例类和线程类都不变
就测试代码改一下,起10个线程,都引用同一实例
        MyThread myThread= new MyThread();
        for(int i=0;i<10;i++){            
            Thread t = new Thread(myThread,String.valueOf(i));
            t.start();
            }
看结果:
com.machome.singleton.MySingleton1@1b67f74:28737396
com.machome.singleton.MySingleton1@1b67f74:28737396
com.machome.singleton.MySingleton1@1b67f74:28737396
com.machome.singleton.MySingleton1@1b67f74:28737396
com.machome.singleton.MySingleton1@1b67f74:28737396
com.machome.singleton.MySingleton1@1b67f74:28737396
com.machome.singleton.MySingleton1@1b67f74:28737396
com.machome.singleton.MySingleton1@1b67f74:28737396
com.machome.singleton.MySingleton1@1b67f74:28737396
com.machome.singleton.MySingleton1@1b67f74:28737396


  • 有状态单例下的多线程
有状态单例
public class MySingleton1 {
    private static final MySingleton1 instance =new MySingleton1();

    private MySingleton1(){}
   
  public static MySingleton1 getInstance() {
        return instance;
    }

    // 状态
    private String name;
    private int age;
   
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
       
}
线程类:
在线程中获取单例,并且在第1号线程和第5号线程分别改变单例的状态
public class MyThreadForStateful implements Runnable{
   
    public void run(){
        MySingleton1 mySingleton1=null;
        mySingleton1 = MySingleton1.getInstance();
       
        if(Thread.currentThread().getName().equals("1")){
            mySingleton1.setName("mac");
            mySingleton1.setAge(11);
        }else if(Thread.currentThread().getName().equals("5")){
            mySingleton1.setName("silly");
            mySingleton1.setAge(22);
        }
       
        System.out.println(Thread.currentThread().getName()
                +":"+mySingleton1+":"
                +mySingleton1.getName()+mySingleton1.getAge());
    }
}
测试代码:
        for(int i=0;i<10;i++){           
            Thread t = new Thread(new MyThreadForStateful(),String.valueOf(i));
            t.start();
            }

执行效果:  证明单例的状态是被多实例共享的
0:com.machome.singleton.MySingleton1@ca0b6:null0
1:com.machome.singleton.MySingleton1@ca0b6:mac11
2:com.machome.singleton.MySingleton1@ca0b6:mac11
3:com.machome.singleton.MySingleton1@ca0b6:mac11
4:com.machome.singleton.MySingleton1@ca0b6:mac11
5:com.machome.singleton.MySingleton1@ca0b6:silly22
6:com.machome.singleton.MySingleton1@ca0b6:silly22
7:com.machome.singleton.MySingleton1@ca0b6:silly22
8:com.machome.singleton.MySingleton1@ca0b6:silly22
9:com.machome.singleton.MySingleton1@ca0b6:silly22
结论:只要多线程能成功获取单例(即多线程获得的单例实例是相同的),必然能共享单例的状态






本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Android设计模式之单例模式
单例模式
5.3.8 在Java中一种更好的单例实现方式
Java多线程编程环境中单例模式的实现
Java设计模式 之 Singleton
单例模式 泛型
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服