读书笔记之单例模式
来源:互联网 发布:高中软件 编辑:程序博客网 时间:2024/06/11 06:45
单例模式
如果我们一开始就给对象赋值一个全局变量,就必须在程序一开始就创建好对象,但是如果这个对象非常浪费资源,而我们又一直没有用到它,就形成了巨大的浪费!我们利用单件模式,就可以在需要的时候创建该对象。
单例模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
首先我们知道一个类没有公共的构造器就无法生成任何对象,一个类默认是一个无参public构造器,那么在其它地方就可以很容易的多次实例化该类:
public class myClass(){ public myClass(){}}
但是我们想将这个类设置成单例模式就必须让构造器私有化,不能被随意调用
public class myClass(){ private myClass(){}}
然后我们在该类中人为的制造一个静态的getInsatnce方法用来返回一个myClass对象
public class myClass(){ //这样该类就不会被实例化 private myClass(){} //获取唯一可用的对象 public static myClass getInstance(){ return new myClass(); } //创建一个方法 public void say(){ System.out.println("Hello World!"); }}
//测试一下
public class Singleton{ public static void main(String[] args) { //不合法的构造函数 //编译时错误:构造函数 SingleObject() 是不可见的 //myClass class = new myClass(); //获取唯一可用的对象 myClass class = myClass.getInstance(); //显示消息 class.showMessage(); }}
应用场景:比如两台电脑连接的同一个打印机,输出的时候肯定保证只有一台打印机在使用;产生唯一序列号;WEB中的计数器
单例的几种实现模式:
一、懒汉式:线程不安全
public class Singleton { //只做初始化,判断后才回返回实例对象,虽然性能好但是不支持多线程 private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
二.懒汉式,但加上同步锁synchronized,线程安全
public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
三、饿汉式
public class Singleton { //在静态初始化器(static initializen)中创建单例,这段代码保证了线程安全,一般建议使用这种方法,但如果有明细懒加载的需求,才会使用第五种方法 private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } }
四.双重加锁,线程安全并且能保证高性能,实现起来较复杂
public class Singleton { private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
五.静态内部类
public class Singleton { //这种方式同样利用静态初始化保证了初始化instance时只有一个线程,但跟第三种方式不同,第三种方式只要singleton类被装载了,instance就会被实例化,这种方式只有调用getInstance方法时,才会装载singleton类。如果实例化instance很消耗资源,就可以使用这种方法更为合适
private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } }
六.枚举
public enum Singleton { INSTANCE; public void whateverMethod() { } }
这种实现方式还没有被广泛采用,但这是实现单例模式的最佳方法。它不仅能避免多线程同步问题,而且还自动支持序列化机制,防止反序列化重新创建新的对象,绝对防止多次实例化。
0 0
- 读书笔记之单例模式
- 读书笔记之单例模式
- 设计模式读书笔记之单例模式(Singleton)
- 《java与模式》读书笔记之三----单例模式
- 单例模式----设计模式之禅读书笔记
- 设计模式读书笔记之单例模式(Singleton)
- 读书笔记-设计模式(一)之单例模式
- 大话设计模式读书笔记之单例模式
- 《Head First Design Patterns》读书笔记之单例模式
- 读书笔记4:单例模式
- 读书笔记4:单例模式
- 读书笔记(一)---单例模式
- 设计模式读书笔记(一)单例模式
- 设计模式读书笔记-----单例模式
- 设计模式读书笔记-----单例模式
- 设计模式读书笔记-----单例模式
- <<设计模式>>读书笔记------单例模式
- 设计模式读书笔记一 单例模式
- 第二十四讲项目四 个人所得税计算器if语句版
- Android drawable不同文件夹的区别
- 春 诗歌2首
- 相位噪声@40 MHz的含义
- sql语句中IN()的使用经验
- 读书笔记之单例模式
- 接上一篇腾讯2016年微信红包编程题
- 如何在国内下载Eclipse及其插件
- 关于spring中使用redis中文乱码问题(redistemplate)
- kettle转换里面sql脚本的执行顺序
- 程序员必会技能系列(2)git的使用-2
- java中4种单例模式实现方法
- WebService之获取天气预报
- 2018Android面试宝典