A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

1. 什么是单例模式
        单例模式是为确保一个类只有一个实例,并为整个系统提供一个全局访问点的一种模式方法。
        单例的特点:
                在任何情况下,单例类永远只有一个实例存在
                单例需要有能力为整个系统提供这一唯一实例

2. 单例模式之懒汉式单例
        实现代码:
        public class MySingleton {
               
                private static MySingleton instance = null;
               
                private MySingleton(){}
               
                public static MySingleton getInstance() {
                        try {
                                if(instance != null){//懒汉式
                                       
                                }else{
                                        //创建实例之前可能会有一些准备性的耗时工作
                                        Thread.sleep(300);
                                        instance = new MySingleton();
                                }
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                        return instance;
                }
        }
假设在创建实例前有一些准备性的耗时工作要处理,多线程调用:

        public class MyThread extends Thread{
                 
                @Override
                public void run() {
                        System.out.println(MySingleton.getInstance().hashCode());
                }
               
                public static void main(String[] args) {
                       
                        MyThread[] mts = new MyThread[10];
                        for(int i = 0 ; i < mts.length ; i++){
                                mts[i] = new MyThread();
                        }
                       
                        for (int j = 0; j < mts.length; j++) {
                                mts[j].start();
                        }
                }
        }
执行结果如下:

1210420568
1210420568
1935123450
1718900954
1481297610
1863264879
369539795
1210420568
1210420568
602269801

从执行结果可以看出,单例的线程安全性并没有得到保证,我们可以做出如下解决方案

三、懒汉式单例之线程安全问题
同步代码块实现
        public class MySingleton {
               
                private static MySingleton instance = null;
               
                private MySingleton(){}
               
                //public synchronized static MySingleton getInstance() {
                public static MySingleton getInstance() {
                        try {
                                synchronized (MySingleton.class) {
                                        if(instance != null){//懒汉式
                                               
                                        }else{
                                                //创建实例之前可能会有一些准备性的耗时工作
                                                Thread.sleep(300);
                                                instance = new MySingleton();
                                        }
                                }
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                        return instance;
                }
        }


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马