java基础,单例总结
来源:互联网 发布:中信公积金网络贷款 编辑:程序博客网 时间:2024/05/16 01:56
一,饱汉
public class SingleTon {private SingleTon(){}private final static SingleTon instance = new SingleTon();public static SingleTon getInstance(){return instance;}public static void main(String[] args) {System.out.println("Main方法");}}或
public class SingleTon {private SingleTon(){}public final static SingleTon instance = new SingleTon();}
二,饿汉,延迟初始化
public class SingleTon2 {private SingleTon2() {System.out.println("构造方法");}private static SingleTon2 instance = null;public static synchronized SingleTon2 getInstance() {if (instance == null) {instance = new SingleTon2();}return instance;}}
二.二 也算是饿汉,但是减少synchronized性能开销的同时,避免double-checked locking
public class SingleTon4 {private static volatile SingleTon4 instance = null;private SingleTon4(){}public static SingleTon4 getInstance(){if(instance == null){synchronized (SingleTon4.class) {if(instance == null){instance = new SingleTon4();}}}return instance;}}
三,基于类初始化的解决方案。线程安全的延迟初始化方案
JVM在类的初始化阶段(即在Class被加载后,且被线程使用之前),会执行类的初始化。在执行类的初始化期间,JVM会去获取一个锁。这个锁可以同步多个线程对同一个类的初始化。
基于这个特性,可以实现另一种线程安全的延迟初始化方案(这个方案被称之为Initialization On Demand Holder idiom)
public class SingleTon5 {private SingleTon5(){System.out.println("heihi");}private static class InstanceHolder {public static SingleTon5 instance = new SingleTon5();}public static SingleTon5 getInstance() {return InstanceHolder.instance ; //这里将导致InstanceHolder类被初始化}}
四,枚举类实现
/** * 单元素的枚举类型是实现单例的最佳方法 */public enum SingleEnum {INSTANCE;public void sayHello(){System.err.println("Hello me");}}
五,记录式单例
jkd8
public class SingleTon3_3 {private static Map<String, SingleTon3_3> map = new HashMap<String, SingleTon3_3>();private SingleTon3_3(String name) {}public static SingleTon3_3 getInstance(String name) {name = Objects.toString(name, SingleTon3_3.class.getName());return map.computeIfAbsent(name, SingleTon3_3::new);}}
jdk7
/** * 记录式单例 */public class SingleTon3 {private static Map<String, SingleTon3> map = new HashMap<String, SingleTon3>();static {SingleTon3 single = new SingleTon3();map.put(single.getClass().getName(), single);}private SingleTon3() {System.out.println("构造method");}public static SingleTon3 getInstance(String name) {if (name == null) {name = SingleTon3.class.getName();}if (map.get(name) == null) {System.out.println("得到" + name);try {map.put(name, (SingleTon3) Class.forName("single_ton.SingleTon3").newInstance());} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}return map.get(name);}}
0 0
- java基础,单例总结
- java基础的零散总结(2)--单例设计模式
- 黑马程序员:Java基础总结----单例设计模式
- 黑马程序员-Java基础-多线程之单例模式总结
- Java单例总结
- Java基础----单例模式
- java基础---单例模式
- Java 基础之单例
- JAVA 基础:模板、单例
- JAVA单例模式总结
- java单例模式总结
- java单例模式总结
- Java基础之单例模式
- java基础之单例模式
- Java基础复习:单例模式
- java基础--单例设计模式
- JAVA基础之单例设计
- 黑马程序员--java基础--单例
- queue
- svn使用规范
- 面试题 11
- 解决xxx is not in the sudoers file.
- c++ char* char*&的区别
- java基础,单例总结
- jquey.fullpage左右无缝轮播
- Redis在新浪微博中的应用
- 鸟哥的Linux私房菜——基础学习篇(第三版)笔记(12)
- linux fork函数
- 【白书之路】455 - Periodic Strings KMP next 数组 求 循环节
- SOAPUI系列07-SOAPUI 断言之三
- tracker服务器
- 从MVC架构到C++的多态实现