这样做是为了提高效率。
在多线程中,这样做是为了确保已经获得过一次s的线程不会再去初始化第二次
举例:- /*
- * 分析:
- * 1、当两个线程同时要对st进行初始化时,当a线程判断st为null时,开始对st进行初始化,a还没有初始化完成b线程也要对st进行初始化,
- * 这是判断st也为null,也开始对st进行初始化,这就违背类单例模式的初衷了。所以要在if判断进行同步处理
- * 2、进行完同步处理后,线程安全了,但是效率太低。因为每个线程都要等待前一个判断时候为null后,才能进行下一个线程的判断,这样会导致许多线程等待
- * 3、由于等待线程太多,这样就会导致效率低,如果在同步代码块前面增加一个判断语句,当st为空,才会进入到同步块,这样就会减少同步块的等待线程数量
- */
- class SingleThread{
- private static SingleThread st;
- private SingleThread(){}
-
- public static SingleThread getSt(){
-
- /*
- * 判断st时候已经实例化完成。
- * 如果没有完成,那么就执行下面的语句
- * 如果已经完成初始化,那么就不执行直接返回st
- */
- if(st == null){
- //在第一个线程初始化完成以前,有可能还有线程进来有进行初始化,这是用来把这样的线程挡在外面的
- synchronized (SingleThread.class) {
- //如果st为null就进行初始化
- if(st == null){
- st = new SingleThread();
- }
- }
- }
- return st;
- }
- }
复制代码 |