码迷,mamicode.com
首页 > 其他好文 > 详细

单例模式

时间:2019-12-08 10:32:57      阅读:64      评论:0      收藏:0      [点我收藏+]

标签:tar   导致   div   作用   thread   syn   线程阻塞   技术   要求   

技术图片

 

 

package com.company.java.oop.instance;
/**
 * 如何设计,才能保证如下类的实例对象
 * 在内存中只有一份?
 * 1)让外界从一个池中去取对象(通过池保证类的实例在池中一份)
 * 2)让外界直接通过类的静态方法获取类内部创建的一个实例。
 */
class Singleton01{//应用场景:小对象
    static Singleton01 instance=new Singleton01();
    private Singleton01() {}
    public static Singleton01 getInstance() {
        return instance;
    }
}

 

class Singleton02{//适合场景:大对象,单线程
    private Singleton02() {
        System.out.println("Singleton02()");
    }
    private static Singleton02 instance;
    /**
     * 线程不安全?导致线程不安全的原因是什么?
     * 1)多个线程并发执行
     * 2)多个线程有共享数据集(例如instance)
     * 3)多个线程在共享数据上的操作不是原子操作。
     * @return
     */
    public static Singleton02 getInstance() {
        if(instance==null) {
            instance=new Singleton02();
        }
        return instance;
    }
}

 

class Singleton04{//适合场景:大对象,线程不多,性能要求不高
    private Singleton04() {
        System.out.println("Singleton04()");
    }
    /**volatile 关键字的作用
     * 1)禁止指令重排序(JVM对java程序进行编译时会有指令重排序的现象)
     * 2)保证可见性(多CPU,一个线程的对某个共享变量的修改对另一个线程是可见的)
     * 3)但不保证原子性(synchronized可以保证)。
     */
    private static volatile Singleton04 instance;
    /**
     * 优化:在保证线程安全的情况下尽量减少线程阻塞。
     * @return
     */
    public static  Singleton04 getInstance() {
        if(instance==null) {
         synchronized (Singleton04.class) {
          if(instance==null) {
            instance=new Singleton04();
            //1.分配空间
            //2.对象属性初始化
            //3.执行构造方法
            //4.将对象赋值给instance变量
          }
         }
        }
        return instance;
    }
}
public class TestInstanceObject04 {
    public static void main(String[] args) {
        Thread t1=new Thread() {
            public void run() {
                Singleton03.getInstance();
                Singleton03.getInstance();
                Singleton03.getInstance();
            };
        };
        Thread t2=new Thread() {
            public void run() {
                Singleton03.getInstance();
                Singleton03.getInstance();
                Singleton03.getInstance();
            };
        };
        t1.start();
        t2.start();
    }
}

 

 

 

单例模式

标签:tar   导致   div   作用   thread   syn   线程阻塞   技术   要求   

原文地址:https://www.cnblogs.com/mengbin0546/p/12004700.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!