- 浏览: 125899 次
- 性别:
- 来自: 吉林
文章分类
- 全部博客 (118)
- oracle数据库 (5)
- Web前端 (3)
- java后台 (6)
- Java虚拟机 (3)
- 大数据 (1)
- Java (27)
- 微信公众号 (1)
- ssh框架 (2)
- Java,eclipse (1)
- Hibernate (4)
- SSH (4)
- asp.net (1)
- XML,JSON (1)
- junit (1)
- SpringMVC (2)
- XML (2)
- JSON (2)
- HTTP AJAX POST请求 (2)
- request payload (1)
- form data (1)
- Content Type (1)
- Spring RESTful (1)
- RESTful (2)
- Git (2)
- 企业软件版本管理工具 (1)
- HIVE,HADOOP (1)
- Hadoop (1)
- Dobbo (1)
- 缓存(cache) (1)
- 服务器端,客户端 (1)
- Cookie (1)
- Session (1)
- MySQL索引 (1)
- 乐观锁,悲观锁 (1)
- 电子商务 (1)
- 面试部分 (1)
- 分布式事务处理 (1)
- java详解 (1)
- commons (1)
- NoClassDefFoundErrorLogFactory (1)
- Spring (1)
- tomcat (3)
- Ubuntu (1)
- 虚拟机 (1)
- Intel Virtual Technology (1)
- SVN (4)
- Taglib (5)
- java unsigned类型 (1)
- fmt (1)
- HMAC (1)
- linux (13)
- mysql (2)
- FTP (4)
- Maven (5)
- spring boot (6)
- myeclipse (1)
- web (1)
- Https (2)
- ssl (3)
- crt (1)
- cer (1)
- byte (1)
- 字符占字节 (1)
- 限制IP远程登录 (1)
- 禁止某些 IP 访问 (1)
- iptables (1)
- linux私钥登陆 (1)
- windows (1)
- openSSH (2)
- 大牛博客地址 (1)
- Maven常见异常 (1)
- shell命令 (1)
- WebWork2,Spring MVC (1)
- LinuxSS (0)
- Bitvise SSH Client (1)
- -bash-4.1$ (1)
- Centos7 (1)
- MQTT (5)
- Mosquitto (3)
- Mosquittos (0)
- HAProxy (1)
- 集群 (0)
- 负载均衡 (1)
- moqutte (1)
- 多线程 (1)
- Queue (1)
- BlockingQueue (1)
- ConcurrentLinkedQueue (1)
- erlang (1)
- jersey (1)
最新评论
概念:
java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。
单例模式有一下特点:
1、单例类只能有一个实例。
2、单例类必须自己自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。
首先看一个经典的单例实现。
java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。
单例模式有一下特点:
1、单例类只能有一个实例。
2、单例类必须自己自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。
首先看一个经典的单例实现。
public class Singleton { private static Singleton uniqueInstance = null; private Singleton() { // Exists only to defeat instantiation. } public static Singleton getInstance() { if (uniqueInstance == null) { uniqueInstance = new Singleton(); } return uniqueInstance; } // Other methods... }
Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。(事实上,通过Java反射机制是能够实例化构造方法为private的类的,那基本上会使所有的Java单例实现失效。此问题在此处不做讨论,姑且掩耳盗铃地认为反射机制不存在。)
但是以上实现没有考虑线程安全问题。所谓线程安全是指:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。显然以上实现并不满足线程安全的要求,在并发环境下很可能出现多个Singleton实例。[/size]
public class TestStream { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } //该类只能有一个实例 private TestStream(){} //私有无参构造方法 //该类必须自行创建 //有2种方式 /*private static final TestStream ts=new TestStream();*/ private static TestStream ts1=null; //这个类必须自动向整个系统提供这个实例对象 public static TestStream getTest(){ if(ts1==null){ ts1=new TestStream(); } return ts1; } public void getInfo(){ System.out.println("output message "+name); } }
public class TestMain { public static void main(String [] args){ TestStream s=TestStream.getTest(); s.setName("张孝祥"); System.out.println(s.getName()); TestStream s1=TestStream.getTest(); s1.setName("张孝祥"); System.out.println(s1.getName()); s.getInfo(); s1.getInfo(); if(s==s1){ System.out.println("创建的是同一个实例"); }else if(s!=s1){ System.out.println("创建的不是同一个实例"); }else{ System.out.println("application error"); } } }
运行结果:
张孝祥
张孝祥
output message 张孝祥
output message 张孝祥
创建的是同一个实例
结论:由结果可以得知单例模式为一个面向对象的应用程序提供了对象惟一的访问点,不管它实现何种功能,整个应用程序都会同享一个实例对象。
1.饿汉式单例类
//饿汉式单例类.在类初始化时,已经自行实例化 public class Singleton1 { //私有的默认构造子 private Singleton1() {} //已经自行实例化 private static final Singleton1 single = new Singleton1(); //静态工厂方法 public static Singleton1 getInstance() { return single; } }
2.懒汉式单例类
//懒汉式单例类.在第一次调用的时候实例化 public class Singleton2 { //私有的默认构造子 private Singleton2() {} //注意,这里没有final private static Singleton2 single=null; //静态工厂方法 public synchronized static Singleton2 getInstance() { if (single == null) { single = new Singleton2(); } return single; } }
3.登记式单例类
import java.util.HashMap; import java.util.Map; //登记式单例类. //类似Spring里面的方法,将类名注册,下次从里面直接获取。 public class Singleton3 { private static Map<String,Singleton3> map = new HashMap<String,Singleton3>(); static{ Singleton3 single = new Singleton3(); map.put(single.getClass().getName(), single); } //保护的默认构造子 protected Singleton3(){} //静态工厂方法,返还此类惟一的实例 public static Singleton3 getInstance(String name) { if(name == null) { name = Singleton3.class.getName(); System.out.println("name == null"+"--->name="+name); } if(map.get(name) == null) { try { map.put(name, (Singleton3) Class.forName(name).newInstance()); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } return map.get(name); } //一个示意性的商业方法 public String about() { return "Hello, I am RegSingleton."; } public static void main(String[] args) { Singleton3 single3 = Singleton3.getInstance(null); System.out.println(single3.about()); } }
发表评论
-
启动tomcat 一直在控制台输出 No mapping found for HTTP request with URI
2016-12-23 11:21 4008启动tomcat 一直在控制台输出 No mapping fo ... -
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory 解决方案
2016-12-23 11:14 806Spring3.1启动时报错: Exception in t ... -
理解RESTful架构
2016-10-14 11:48 478越来越多的人开始意识 ... -
Spring RESTful服务接收和返回JSON最佳实践
2016-10-14 09:51 469返回JSON 1) 用Maven构建web项目: 构建过程 ... -
IE10以下的IE浏览器在form表单提交、a标签等场景下,接收application/json类型的响应时,会提示是否要下载该json文件
2016-10-13 15:35 560IE10以下的IE浏览器在form表单提交、a标签等场景下,接 ... -
SpringMVC如何接收application/json内容编码类型的参数?
2016-10-13 15:35 677[size=medium] 在上代码之前,有必要先说说@Res ... -
详解java类的生命周期
2016-04-28 10:16 451[size=small]引言 最近有 ... -
Struts+Spring+Hibernate整合入门详解
2016-04-28 10:18 409Java 5.0 Struts 2.0.9 Spring ... -
switch语句中的表达式
2016-04-28 10:18 679switch语句中的表达式只能是byte,short,char ... -
常见的几种RuntimeException
2016-04-27 14:13 373一般面试中java Exception(runtimeExce ... -
Java陷阱一箩筐----面试题集
2016-04-27 13:52 391找工作要面试,有面试就有对付面试的办法。以下一些题目来自我和我 ... -
控制层SpringMVC和Struts2的区别
2016-04-26 16:24 438我们现在流行的常用的M ... -
MyBatis快速入门
2016-04-26 16:12 340只为成功找方法,不为失败找借口! MyBatis学习总结(一) ... -
Integer.toString(int par1,int par2)
2016-04-25 14:44 330Integer.toString(int par1,int ... -
Java中堆内存和栈内存详解
2016-04-01 10:32 448Java把内存分成两种,一 ... -
负数的二进制表示方法
2016-03-29 15:24 500今天在看base64编码转换时,既然对负数的二进制表示有些遗忘 ... -
Java关键字final、static使用总结
2016-03-24 11:24 316Java关键字final、static使 ... -
JAVA——Class对象的三种生成方式
2016-03-23 16:18 442Class类(在java.lang包中,Instances o ... -
Java内部类
2016-03-22 16:28 297http://www.cnblogs.com/yaoyingl ... -
java中的内部类总结
2016-03-22 16:02 416内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个 ...
相关推荐
java单例模式详解 简单代码实现2中单例模式 有详细的文字说明。
java单例模式详解Java系列2021.pdf
主要介绍了9种Java单例模式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Java设计模式-单例模式详解
java设计模式之单例模式详解,包含例子,详解。
详解JAVA单例模式及多种实现
1、掌握单例模式的应用场景。 2、掌握 IDEA 环境下的多线程调试方式。 3、掌握保证线程安全的单例模式策略。 4、掌握反射暴力攻击单例解决方案及原理分析。 5、序列化破坏单例的原理及解决方案。 6、掌握常见的...
java 单例模式和工厂模式实例详解.docx
Java设计模式-单例模式详解,包含三种模式式:饿汉,懒汉,登记式,以及线程多同步的处理
主要介绍了java 单例模式的实例详解的相关资料,希望通过本文能帮助大家彻底理解掌握这部分内容,需要的朋友可以参考下
【课堂笔记】单例模式详解
主要介绍了Java 单例模式线程安全问题的相关资料,希望通过本文大家能了解掌握单例模式中线程安全的使用方法,需要的朋友可以参考下
单例设计模式: 1、构造函数私有 2、定义类型为本身类型的成员 3、类中提供一个公共的并且静态的获取本类实例的方法
在本篇文章里小编给大家整理的是关于Java单例模式的知识点详解,有兴趣的朋友们可以学习参考下。
java设计模式详解,内容包括java开发中常用的开发模式,例如单例模式以及相应的实现方法等,我找了好久,所以分稍微多点
主要介绍了Java单例模式实现的几种方式的相关资料,需要的朋友可以参考下
今天小编就为大家分享一篇关于Java双重检查加锁单例模式的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
本文实例讲述了JavaScript设计模式—单例模式.分享给大家供大家参考,具体如下: 单例模式也称为单体模式,其中: 1,单体模式用于创建命名空间,将系列关联的属性和方法组织成一个逻辑单元,减少全局变量。 逻辑...
主要介绍了Java设计模式编程中的单例模式和简单工厂模式以及实例,使用设计模式编写代码有利于团队协作时程序的维护,需要的朋友可以参考下