多线程下单例设计模式的实现
2016-05-13 16:40
225 查看
package concurrent; /** * 单例设计模式与多线程 (1)立即加载与饿汉模式 (2)延迟加载与懒汉模式(3)内置静态类实现单例设计模式 * (4)枚举类实现单例设计模式 * * @author foolishbird_lmy * */ class SingletonA { // 立即加载与饿汉模式 private static SingletonA sa = new SingletonA(); private SingletonA() { } public static SingletonA getInstance() { return sa; } } class SingletonB { // 延迟加载与懒汉模式,双检查模式 private static SingletonB sb; private SingletonB() { } public static SingletonB getInstance() { // 延迟加载 if (sb == null) { synchronized (SingletonB.class) { if (sb == null) { sb = new SingletonB(); } } } return sb; } } class SingletonC { //内部类 private static class SingletonHandler{ private static SingletonC sc = new SingletonC(); } private SingletonC(){ } public static SingletonC getInstance(){ return SingletonHandler.sc; } } enum SingletonD{ //使用enum枚举类实现单例模式 INSTANCE; public void get(){ System.out.println(); } } class SingletonThread extends Thread { public void run() { System.out.println(SingletonA.getInstance().hashCode()); System.out.println(SingletonB.getInstance().hashCode()); System.out.println(SingletonC.getInstance().hashCode()); System.out.println(SingletonD.INSTANCE.hashCode()); } } public class TestSingleton { public static void main(String[] args) { SingletonThread st1 = new SingletonThread(); SingletonThread st2 = new SingletonThread(); SingletonThread st3 = new SingletonThread(); st1.start(); st2.start(); st3.start(); } }
1、恶汉:因为加载类的时候就创建实例,所以线程安全(多个ClassLoader存在时例外)。缺点是不能延时加载。
2、懒汉:需要加锁才能实现多线程同步,但是效率会降低。优点是延时加载。
3、双重校验锁:麻烦,在当前Java内存模型中不一定都管用,某些平台和编译器甚至是错误的,因为sb = new SingletonB()这种代码在不同编译器上的行为和实现方式不可预知。
4、静态内部类:延迟加载,减少内存开销。因为用到的时候才加载,避免了静态field在单例类加载时即进入到堆内存的permanent代而永远得不到回收的缺点(大多数垃圾回收算法是这样)。
5、枚举:很好,不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。
相关文章推荐
- Nodejs in Visual Studio Code 13.构建单页应用Scrat示例挖一挖
- 装黑苹果的一点准备工作
- golang中的类型和接口
- eclipse工程导入Android studio 有些包无效的解决
- 用apns_server 进行推送
- Android使用ImageView 制作透明圆弧实例代码
- 局域网实现VLAN实例
- ADTS和LATM的AAC格式
- 在Spring Boot启动后执行指定代码
- java.math.BigDecimal cannot be cast to java.lang.String解决方法
- Android学习笔记八:SQLite判断一张表是否存在
- Java小程序:猜数值小游戏
- SQL 性能调优日常积累
- ajaxsubmit success 不执行和ajaxsubmit使用问题
- 在Spring Boot启动后执行指定代码
- html和htm、html5对比
- mysql read_buffer_size 设置多少合适
- UIImageView------Android中的imageview
- 对[].slice.call(arguments,1) 的一丢丢见解
- Android之注解IOC(二)