Singletom 单例
class Singletom
{
//最差写法。构造方法是public的,有可能会被new出多个,那就不是单例了。
public Singletom(){
}
public static Singletom instance ;
public static void getInstance(){
if(instance==null){
instance= new Singletom();
}
}
} class Singletom
{
//构造改成私有,基本满足,但多线程时,可能同时在get时是空,同时去new了对象。也出现了多个对象情况。
private Singletom(){ }
private static Singletom instance ;
public static void getInstance(){
if(instance==null){
instance= new Singletom();
}
}
} class Singletom
{ private Singletom(){ }
private static Singletom instance ;
//针对多线程进行同步,到这儿这个单例基本比较完善了。
public static synchronized void getInstance(){
if(instance==null){
instance= new Singletom();
}
return instance ;
}
} class Singletom
{ private Singletom(){ }
//双重检查模式
private static Singletom instance ;
public static void getInstance(){
if(instance==null){
synchronized(Singletom.class){
if(instance==null){ instance= new Singletom();
} }
}
return instance ;
}
} class Singletom
{ private Singletom(){ }
//加上原子操作,进一步保证多线程安全。
private static volatile Singletom instance ;
public static void getInstance(){
if(instance==null){
synchronized(Singletom.class){ synchronized(Singletom.class){
if(instance==null){
instance= new Singletom();
} }
} } return instance ; } }
//饿汉式实现
//这种方法比较完美,但是这个类会在载入的时候提前实例化,会浪费空间。
public class SingleB { private static final SingleB INSTANCE = new SingleB(); private SingleB() {} public static SingleB getInstance() { return INSTANCE; } }
// Effective Java 第一版推荐写法 public class Singleton { private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } }
牛逼之处
对于内部类SingletonHolder,它是一个饿汉式的单例实现,在SingletonHolder初始化的时候会由ClassLoader来保证同步,使INSTANCE是一个真·单例。同时,由于SingletonHolder是一个内部类,只在外部类的Singleton的getInstance()中被使用,所以它被加载的时机也就是在getInstance()方法第一次被调用的时候。
《Effective Java》的作者在这本书的第二版又推荐了另外一种方法,来直接看代码: 复制代码
// Effective Java 第二版推荐写法 public enum SingleInstance { INSTANCE; public void fun1() { // do something } } // 使用 SingleInstance.INSTANCE.fun1();
复制代码
看到了么?这是一个枚举类型……连class都不用了,极简。
Singletom 单例的更多相关文章
- C# 单例模式和窗体的单例打开方法
第一种最简单,但没有考虑线程安全,在多线程时可能会出问题,不过俺从没看过出错的现象,表鄙视我…… public class Singleton{ private static Singleton ...
- java单例设计模式
单例模式的特点: 1.单例类只能有一个对象(实例). 2.单例类必须自己创建自己的唯一实例 . 3.单例类必须给所有其他对象提供这一实例. 设置步骤: 1.将对象的应用成员变量用private来修饰. ...
- DBUtil数据库连接单例 —— 简单不简单
单例大概是我最早产生明确模式意识的设计模式,因为它足够简单粗暴,目的足够明确. 单例么,就是不管怎么访问,都返回一个单一实例就好了,我最早应用在数据库的DBUtil中. public class DB ...
- SSH中Action的单例与多例
Structs2中的Bean默认的是单例,在整个程序运行期间,每个Bean只有一个实例,只要程序在运行,这个实例就一直存在. 对于Action来说,单例就容易出问题.如果客户端每次提交的参数都是一样的 ...
- 《连载 | 物联网框架ServerSuperIO教程》- 8.单例通讯模式开发及注意事项
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- static实现单例的隐患
1. 前言 Java的单例有多种实现方式:单线程下的简单版本.无法在指令重排序下正常工作的Double-Check.static.内部类+static.枚举--.这篇文章要讨论的,是在使用static ...
- 架构师养成记--6.单例和多线程、ThreadLocal
一.ThreadLocal 使用wait/notify方式实现的线程安全,性能将受到很大影响.解决方案是用空间换时间,不用锁也能实现线程安全. 来看一个小例子,在线程内的set.get就是thread ...
- 在Swift中实现单例方法
在写Swift的单例方法之前可以温习一下Objective-C中单例的写法: + (instancetype)sharedSingleton{ static id instance; static d ...
- Javascript设计模式学习二(单例)
定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点 普通的单例模式: 使用一个变量来标记当前是否已经为某个类创建过对象,如果是的话,在下一次获取该类的实例时,直接返回之前创建的对象.比如:使用 ...
随机推荐
- 网络初级篇之OSPF(二)实验
一.实验目的: 下面关于OSPF的实验,仔细看配置过程,以增加对OSPF的理解. 二.实现目标: 使用OSPF实现所有主机之间的通信 三.配置过程: 1.AR1的配置过程: ...
- Linux配置iSCSI存储
1.基础知识 1.1 存储相关 直接存储(DAS):例如本机上的磁盘,就是属于直接存储设备. 存储区域网络(SAN):来自网络内的其他存储设备提供的磁盘.Iscsi就是属于该方式. ...
- linux系统使用grep命令提取文件的基名或者路径名
效果等于~]#dirname /etc/sysconfig/network-scripts/ifcfg-ens33 echo "/etc/sysconfig/network-scripts/ ...
- Codeforces Round #344 (Div. 2) D. Messenger (KMP)
D. Messenger time limit per test2 seconds memory limit per test512 megabytes inputstandard input out ...
- 【未知来源】Happy
题意 给出一个 \(n\) 个节点的树,两点之间有且仅有一条路径相连. 给出 \(m\) 个点对 \(x_i,y_i\),如果添加一条双向边 \((u,v)\) 后 \(x_i\) 和 \(y_i\) ...
- hdu4405 概率dp
飞行棋游戏 问从0结束游戏的投色子次数期望是多少 设dp[i]表示i到n的期望,那么可以得到dp[i]=(dp[i+1]+dp[i+2]+dp[i+3]+dp[i+4]+dp[i+5]+dp[i+6] ...
- ES添加文档 踩坑之 —— The number of object passed must be even but was [1]
读取文件,获取json格式的数据doc, 然后使用 bulkRequestBuilder.add(client.prepareIndex(index, type, id).setSource(doc) ...
- tomcat访问日志
* %a - Remote IP address # 远程ip地址 * %A - Local IP address # 本地ip地址 * %b - Bytes sent, excluding HTTP ...
- nginx第二天
nginx配置文件 配置文件结构 全局配置(user.worker_processes.error_log.pid) events(网络连接相关,worker_connections) http(最重 ...
- 简单使用logback日志框架
logback_config.xml 配置文件信息 <?xml version="1.0" encoding="UTF-8"?> <confi ...