//饿汉式:资源利用率较低(无论是否需要都会创建),性能较高(使用前无需判断实例是否存在,可直接使用)
public class EagerSingleton{
private static final EagerSingleton instance=new EagerSingleton();
private EagerSingleton(){}
public static EagerSingleton getInstance(){
return instance;
}
}
 //懒汉式:资源利用率较高(需要时才创建),性能较低(需要判断实例是否存在)
public class LazySingleton{
private static LazySingleton instance;
private LazySingleton(){}
synchronized/*同步很重要,保证多线程时安全*/ public static LazySingleton getInstance(){
if(instance==null){
instance=new LazySingleton();
}
return instance;
}
}
 //这是个错误示例:双重检查成例对java语言编译器不成立,在线程1进入第2个if时,引用instance被创建,
//但可能未来得及被实例化,此时线程2在第1个if时判断引用instance不为空则直接返回instance,但JDK不允许
//返回一个没有实例化的对象,所有会导致系统崩溃。
public class LazySingleton{
private static LazySingleton instance;
private LazySingleton(){}
public static LazySingleton getInstance(){
if(instance==null){
synchronized(LazySingleton.class){
if(instance==null){
System.out.println("LazySingleton.getInstance()");
instance=new LazySingleton();
}
}
}
return instance;
}
}
 package com.tn.pattern;

 import java.util.HashMap;

 public class Client {
public static void main(String[] args) throws Exception {
RegSingleton.getInstance(null).print();
RegSingletonChild.getInstance().print();
}
} //登记式
class RegSingleton{
private static HashMap singletons=new HashMap();
static{
RegSingleton instance=new RegSingleton();
singletons.put(instance.getClass().getName(), instance);
} protected RegSingleton(){} public static RegSingleton getInstance(String name){
if(name==null)
name="com.tn.pattern.RegSingleton";
if(singletons.get(name)==null){
try {
singletons.put(name, Class.forName(name).newInstance());
} catch (Exception e) {
e.printStackTrace();
}
}
return (RegSingleton)singletons.get(name);
}
public void print(){
System.out.println("RegSingleton.print()");
}
} class RegSingletonChild extends RegSingleton{
public RegSingletonChild(){} public static RegSingletonChild getInstance(){
return (RegSingletonChild)RegSingleton.getInstance("com.tn.pattern.RegSingletonChild");
} public void print(){
System.out.println("RegSingletonChild.print()");
}
}

最新文章

  1. 【转】 Camera模仿3D效果的小例子(图片无限旋转)
  2. C++ MFC控制台输出调试信息
  3. squid-nginx 基本配置
  4. Redis简介-安装-入门
  5. angular 三目运算符 需要换色或style
  6. java中split()特殊符号"." "|" "*" "\" "]"
  7. php 获取图片、swf的尺寸大小
  8. nodejs保存文件的问题
  9. HTML5之Canvas影片广场
  10. vue中引入jQuery和bootstrap
  11. 如何组织AxTOCControl里面的数据
  12. nginx+php负载均衡集群环境中的session共享方案梳理
  13. java.lang.ClassCastException:weblogic.xml.jaxp.RegistryDocumentBuilderFactory cannot be cast to javax.xml.parsers.DocumentBuilderFactory
  14. Process 开启子进程 的两种方式、join控制子进程、守护进程
  15. Spring 面试问题 TOP 50
  16. python内存数据库pydblite
  17. mysql 常用语句集
  18. CentOS Tomcat启动 Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
  19. 转:Window_Open详解
  20. spark 基础开发 Tips总结

热门文章

  1. Samples for Parallel Programming with the .NET Framework
  2. StackExchange.Redis学习笔记(四) 事务控制和Batch批量操作
  3. Mysql的学习笔记(一)--检验数据库是否安装成功以及一些入门的简单的dos命令
  4. get和post请求及函数调用模式
  5. android sdk manager 国内镜像
  6. Could not resolve view with name '***' in servlet with name 'dispatcher'
  7. 苹果快速的修复了Mac OS High Sierra 上出现了root的漏洞
  8. Anaconda 安装 Python 库(MySQLdb)的方法
  9. 整合SSH时,遇到了org.springframework.beans.factory.BeanCreationException错误
  10. MySQL服务找不到了,navicat打不开数据库连接