博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 设计模式之单例模式
阅读量:6672 次
发布时间:2019-06-25

本文共 2633 字,大约阅读时间需要 8 分钟。

-------Success is getting what you want, happiness is wanting what you get.

 

java设计模式之单例模式(Singleton)

     ---应用场合:只需要一个对象就可以了,例如一个朝代一个皇帝。

     ---作用:保证某个应用程序中某个实例有且只有一个。共同使用一个,节省资源。

     ---类型:饿汉模式,懒汉模式。

 

一.饿汉模式(类加载的时候就会实例化,线程安全)

1 package com.sun.singleton; 2  3 //饿汉模式 4 public class Singleton { 5  6     //将构造函数私有化,不允许外部直接调用创建对象 7     private Singleton(){ 8          9     }10     //内部创建类的唯一实例,用private static 修饰(加载类时实例化一次,之后无论调用几次用的都是这一个实例)11     private static Singleton instance = new Singleton();12     13     //提供一个外部用于获取实例的方法,用 public static 修饰14     public static Singleton getInstance(){15         return instance;16     }17 18 }

 

二. 懒汉模式(比较懒,所以只有调用方法getInstance时候根据判断结果才会实例化,而且线程不安全)

        线程不安全原因:如果是单线程那懒汉模式也没有问题,但如果是多线程且没有加锁处理就不行了。不如A,B两个线程,A线程首先调用getInstance方法,判断instance 为空,即将创建实例,就在这时cpu切换到B线程,A暂停。B线程调用getInstance方法判断instance为空,然后创建实例,创建结束后B线程结束,A线程开始继续执行,注意:此时A线程已经判断过instance为空,那么会继续创建实例,这样线程AB都各自创建了实例,就不再是单例模式。------所以懒汉模式要加锁同步。

package com.sun.singleton;//懒汉模式(线程不安全)public class Singleton2 {        //1.构造函数私有化,不允许外部直接调用    private Singleton2(){            }        //2.只是声明类的唯一实例,这时没有真正实例化,使用private static 修饰    private static Singleton2 instance;        //3.提供获取实例的方法,用public static修饰 // (1).解决线程不安全-------加同步(每个线程每次获取实例都要判断下锁,效率比较低)    public static synchronized Singleton2 getInstance(){        if(instance == null){            return instance = new Singleton2();        }        return instance;    }        //(2).解决线程不安全-----双重检查锁定(提高效率)    public static Singleton2 getInstance2(){        /*如果第一个线程获取到了单例的实例对象,后面的线程再获取实例的时候不需要进入同步代码块中了*/        if(instance == null){            synchronized (Singleton2.class) {                if(instance == null){                    instance = new Singleton2();                }            }        }        return instance;    }        }

 输出:

package com.sun.singleton;public class Main {    public static void main(String[] args) {                //实例化两次作比较测试        //饿汉式        Singleton s1= Singleton.getInstance();        Singleton s2= Singleton.getInstance();        if(s1==s2){            System.out.println("饿汉式是同一个实例");        }else{            System.out.println("饿汉式不是同一个实例");        }        //懒汉式        Singleton2 s3 = Singleton2.getInstance();        Singleton2 s4 = Singleton2.getInstance();        if(s3==s4){            System.out.println("懒汉式是同一个实例");        }else{            System.out.println("懒汉式不是同一个实例");        }    }}

 

 结果截图:

说明单例模式是同一个对象实例化是共享一个内存空间。

 

两者区别:

           饿汉模式:类加载的时候比较慢(加载时候实例化),但是运行时候比较快,线程安全。

           懒汉模式:类加载的时候比较快,但是运行时候比较慢(调用方法的时候实例化),线程不安全。

 

 

 

这是自己学习过程中的记录,方便自己回顾,好记性不如烂笔头。

 

作者:艺至  

------------2015-11-20 16:42:51

 

转载于:https://www.cnblogs.com/sunjiguang/p/4981316.html

你可能感兴趣的文章
HDS G1000和Gx00的端口属性
查看>>
Innodb中mysql如何快速删除2T的大表
查看>>
bash基本命令的使用(笔记)
查看>>
windows_learn 002 用户管理和组策略
查看>>
kafka性能优化
查看>>
含有echart 图表的报表打印
查看>>
域控迁移为08 R2后无法访问Linux服务器共享
查看>>
我的友情链接
查看>>
华为认证考试
查看>>
我的友情链接
查看>>
nosql之redis简单安装与使用
查看>>
基于LVS的NAT模式实现PHP应用
查看>>
在物质与精神之间实现平衡
查看>>
vim 文本编辑器
查看>>
使用angular做微信内html5开发时碰到的两个坑
查看>>
pvst+
查看>>
博为峰Java技术题 ——JavaEE Servlet 国际化Ⅰ
查看>>
linux学习笔记(一)
查看>>
【Spring Boot】13.整合druid
查看>>
Java并发和并行的区别
查看>>