单例模式/ java实现附代码 /
注: 场景和例子出自github的设计模式。传送门:https://github.com/iluwatar/java-design-patterns/tree/master/singleton
意图:
单例模式即使为了确保一个类只有一个实例,并提供一个全局访问点。
场景:
世界上只有一座象牙塔可以让巫师学习魔法,所有巫师都来到这座象牙塔进行修习。那么象牙塔就这里可以理解为单例。简单的来说就是只创建一个类的一个对象,这个象牙塔就可以理解为唯一对象。
实现:
想更好的理解单例模式,最好先了解一下java中的关键字Static。传送门:http://www.cnblogs.com/ahangBlogs/p/7719330.html
talk is cheap,show me the code.........................................................................................................................................................................................................................................(分割线)
列举几种单例模式的实现方法:
一:
package Singleton;
public final class IvoryTower {
private IvoryTower(){}
private static final IvoryTower Instance=new IvoryTower();
public static IvoryTower GetInstance(){
return Instance;
}
}
二:ThreadSafeLazyLoaded
package Singleton;
public final class ThreadSafeLazyLoadedIvoryTower {
private static ThreadSafeLazyLoadedIvoryTower Instance; private ThreadSafeLazyLoadedIvoryTower(){
if(Instance!=null){
throw new IllegalStateException("Already initialized.");
}
}
public static ThreadSafeLazyLoadedIvoryTower GetInstance(){
if(Instance==null){
Instance=new ThreadSafeLazyLoadedIvoryTower();
}
return Instance;
}
}
三:线程安全双重锁检查
package Singleton;
public class ThreadSafeDoubleCheckLocking {
private static ThreadSafeDoubleCheckLocking instance; private ThreadSafeDoubleCheckLocking(){
if(instance!=null){
throw new IllegalStateException("Already instance!");
}
} public static ThreadSafeDoubleCheckLocking GetInstance(){
//使用局部变量可提高25%性能。 出自effectice java th2.. 简单来说就是局部变量保存在堆栈中....
ThreadSafeDoubleCheckLocking result=instance; //检查单例模式的实力是否初始化,如果已经初始化就直接返回实例,没有初始化就往下走
if(result==null){
//实例没有初始化,不过我们不能确保在这个时间段其他线程是否初始化了这个实例, 所以为了确保正确我们得锁住一个对象来互相排斥。
synchronized (ThreadSafeDoubleCheckLocking.class) {
//再次将是实例赋值给局部变量,这时候当前线程无法进入该锁空间,如果已经初始化我们返还实例
result=instance; if(result==null){
//进入该if中,即没有在其他线程中进行初始化。那么我们可以安全的创建一个实例作为我们的单例实例。
instance=result=new ThreadSafeDoubleCheckLocking();
}
}
}
return result;
} }
四:
package Singleton;
public enum EnumIvoryTower {
INSTANCE;
@Override
public String toString(){
return getDeclaringClass().getCanonicalName() + "@" + hashCode();
}
}
适用性:
使用Singleton模式
- 必须只有一个类的实例,并且必须可以从知名访问点访问客户端
- 当唯一的实例应该通过子类来扩展时,客户端应该能够使用扩展实例而不修改它们的代
缺点:
- 违反单一责任原则(SRP)通过控制自己的创作和生命周期。
- 鼓励使用全局共享实例,以防止该对象使用的对象和资源被释放。
- 创建紧密耦合的代码。Singleton的客户变得难以测试。
单例模式/ java实现附代码 /的更多相关文章
- 观察者模式/ java实现附代码 /
/注:场景和例子引用github上的设计模式.传送门:https://github.com/iluwatar/java-design-patterns/tree/master/observer 场景: ...
- 正则表达式学习笔记(附:Java版示例代码)
具体学习推荐:正则表达式30分钟入门教程 . 除换行符以外的任意字符\w word,正常字符,可以当做变量名的,字母.数字.下划线.汉字\s space,空白符 ...
- 单例模式及C++实现代码
单例模式及C++实现代码 单例模式 单例模式,可以说设计模式中最常应用的一种模式了,据说也是面试官最喜欢的题目.但是如果没有学过设计模式的人,可能不会想到要去应用单例模式,面对单例模式适用的情况,可能 ...
- SpringCloud-创建服务消费者-Feign方式(附代码下载)
场景 SpringCloud-服务注册与实现-Eureka创建服务注册中心(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...
- JPA中实现双向多对多的关联关系(附代码下载)
场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...
- Dubbo与SpringBoot整合流程(从实例入手,附代码下载)
场景 Dubbo环境搭建-管理控制台dubbo-admin实现服务监控: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10362 ...
- 07.深入浅出 Spring Boot - 数据访问之Mybatis(附代码下载)
MyBatis 在Spring Boot应用非常广,非常强大的一个半自动的ORM框架. 代码下载:https://github.com/Jackson0714/study-spring-boot.gi ...
- 分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载
一.分布式消息总线以及基于Socket的实现 在前面的分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一文之中给大家分享和介绍了一个极其简单也非常容易上的基于.N ...
- 分享5种风格的 jQuery 分页效果【附代码】
jPaginate 是一款非常精致的分页插件,提供了五种不同风格的分页效果,支持鼠标悬停翻页,快速分页功能.这款插件还提供了丰富的配置选项,你可以根据需要进行设置. 效果演示 源码下载 各个 ...
随机推荐
- Shell基础知识和编程规范
一,Shell环境查看 1.1 查看系统Shell支持情况 [root@linux-node1 ~]# cat /etc/shells /bin/sh /bin/bash /sbin/nologin ...
- django中数据库的相关操作
一.使用环境 python2.7,django>1.7 二.数据库进行配置 在setting文件中进行修改 1.找到DATABASES DATABASES = { 'default': { 'E ...
- C/C++ 数据结构之算法(面试)
数据结构中的排序算法. 排序算法的相关知识: (1)排序的概念:所谓排序就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来. (2)稳定的排序方法:在待排序的文件中,若存在多个关键字相同的 ...
- 转:python常用运维脚本实例
python常用运维脚本实例 转载 file是一个类,使用file('file_name', 'r+')这种方式打开文件,返回一个file对象,以写模式打开文件不存在则会被创建.但是更推荐使用内置函 ...
- nyoj 715 Adjacent Bit Counts
描述 For a string of n bits x1, x2, x3, …, xn, the adjacent bit count of the string is given by ...
- ny16 矩形嵌套
矩形嵌套 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a< ...
- php preg正则表达式
Note: 反斜线在单引号字符串和双引号字符串 中都有特殊含义,因此要匹配一个反斜线, 模式中必须写为 ”\\\\”. 译注: “/\\/”, 首先它作为字符串,反斜线会进行转义, 那么转义后的结果是 ...
- K-Means聚类算法的原理及实现【转】
[转]http://www.aboutyun.com/thread-18178-1-1.html 问题导读:1.如何理解K-Means算法?2.如何寻找K值及初始质心?3.如何应用K-Means算法处 ...
- sqlserver判断是否为数字的函数
ISNUMERIC 确定表达式是否为一个有效的数字类型. 语法 ISNUMERIC ( expression ) 参数 expression 要计算的表达式. 返回类型 int 测试: select ...
- eclipse的remote search
一般你希望以部分文件名作为关键字的时候,可以选择这个搜索选项,当然你也可以选择操作系统自带的搜索功能