1、单例模式(立即加载、延时加载)

来源:互联网 发布:windows安装centos引导 编辑:程序博客网 时间:2024/06/04 00:32
A、饿汉模式
package demo;
/** * Created by sunyifeng on 17/10/19. */public class ObjectA {    // 饿汗模式(立即加载)    private static ObjectA myObject = new ObjectA();    public ObjectA() {        // do noting    }    public static ObjectA getInstance() {        return myObject;    }}
package demo;/** * Created by sunyifeng on 17/10/19. */public class ThreadA extends Thread {    @Override    public void run() {        super.run();        System.out.println(ObjectA.getInstance());    }}
package demo;/** * Created by sunyifeng on 17/10/19. */public class RunA {    public static void main(String[] args) {        ThreadA threadA1 = new ThreadA();        ThreadA threadA2 = new ThreadA();        ThreadA threadA3 = new ThreadA();        threadA1.start();        threadA2.start();        threadA3.start();    }}
运行结果:

demo.ObjectB@2e2f95db
demo.ObjectB@2e2f95db
demo.ObjectB@2e2f95db

程序分析:

1、饿汉模式,实例变量赋值给静态变量,在被调用之前,类加载的时候即创建实例;

2、执行结果线程三个线程调用的是同一个实例;

2、该模式的缺点是如果有其他实例变量,不能保证线程安全。

B、懒汉模式

package demo;/** * Created by sunyifeng on 17/10/19. */public class ObjectB {    // 懒汉模式(延时加载)    private volatile static ObjectB myObject2;    private ObjectB() {    }    public static ObjectB getInstance() {        try {            Thread.sleep(3000);            synchronized (ObjectB.class) {                if (myObject2 == null) {                    myObject2 = new ObjectB();                }            }        } catch (InterruptedException e) {            e.printStackTrace();        }        return myObject2;    }}
package demo;/** * Created by sunyifeng on 17/10/19. */public class ThreadB extends Thread {    @Override    public void run() {        super.run();        System.out.println(ObjectB.getInstance());    }}
package demo;/** * Created by sunyifeng on 17/10/19. */public class RunB {    public static void main(String[] args) {        ThreadB threadB1 = new ThreadB();        ThreadB threadB2 = new ThreadB();        ThreadB threadB3 = new ThreadB();        //        threadB1.start();        threadB2.start();        threadB3.start();    }}
运行结果:

demo.ObjectB@1e682cd7
demo.ObjectB@1e682cd7
demo.ObjectB@1e682cd7

程序分析:

1、使用懒汉模式,三个线程取得是同一实例;

2、懒汉模式是静态变量,但是没有赋值,被调用时创建单例赋值给静态变量;

3、懒汉模式如果不同步(synchronized),每次调用时会创建不同的实例,如果同步方法或者同步代码块,效率都很低(排斥其他线程进入);

4、程序中使用了双检查锁机制(DCL)实现多线程环境中延时加载单列设计模式。

原创粉丝点击