内容简介:一、懒汉式(线程不安全)二、懒汉式(线程安全)三、饿汉式(线程安全)
一、懒汉式(线程不安全)
package com.java.singleton; //懒汉式 线程不安全 public class LazySingleton { //私有构造方法 只允许在内部进行实例的创建 private LazySingleton() { } private static LazySingleton instance = null; //创建实例 public static LazySingleton getInstance() { if (instance == null) { instance = new LazySingleton(); } return instance; } }
二、懒汉式(线程安全)
package com.java.singleton; //懒汉式 线程安全 public class SynchronizedLazySingleton { //私有构造方法 只允许在内部进行实例的创建 private SynchronizedLazySingleton() { } private static SynchronizedLazySingleton instance = null; //创建实例 线程安全 public static synchronized SynchronizedLazySingleton getInstance() { if (instance == null) { instance = new SynchronizedLazySingleton(); } return instance; } }
三、饿汉式(线程安全)
package com.java.singleton; //饿汉式 public class HungrySingleton { //私有构造方法 只允许在内部进行实例的创建 private HungrySingleton() { } //静态初始化 由JVM保证线程安全 private static HungrySingleton instance = new HungrySingleton(); //创建实例 public static HungrySingleton getInstance() { return instance; } }
四、缓存实现(线程不安全)
package com.java.singleton; import java.util.HashMap; import java.util.Map; //线程不安全 缓存实现 public class CacheSingleton { //私有构造方法 只允许在内部进行实例的创建 private CacheSingleton() { } //构造缓存容器 private static Map<String, CacheSingleton> map = new HashMap<>(); //构造默认的存放key private static final String DEFAULT_KEY = "Cache"; //创建实例 public static CacheSingleton getInstance() { //先从缓存中取 没有就创建并放入缓存 有就返回 CacheSingleton instance = (CacheSingleton) map.get(DEFAULT_KEY); if (instance == null) { instance = new CacheSingleton(); map.put(DEFAULT_KEY, instance); } return instance; } }
五、双重检查加锁(懒汉式 线程安全的进一步优化)
package com.java.singleton; //双重检查加锁 懒汉式在方法上加synchronized的进一步优化 public class DoubleCheckedLockingSingleton { //私有构造方法 只允许在内部进行实例的创建 private DoubleCheckedLockingSingleton() { } //volatile 修饰的变量不会被本地线程缓存 对该变量的读写直接作用于共享内存 类似于互斥锁 private volatile static DoubleCheckedLockingSingleton instance = null; //创建实例 public static DoubleCheckedLockingSingleton getInstance() { if (instance == null) { synchronized (DoubleCheckedLockingSingleton.class) { if (instance == null) { instance = new DoubleCheckedLockingSingleton(); } } } return instance; } }
六、 Lazy Initialization Holder Class实现单例
package com.java.singleton; //静态内部类 Lazy Initialization Holder Class public class LazyInitializationHolderClassSingleton { //私有构造方法 只允许在内部进行实例的创建 private LazyInitializationHolderClassSingleton() { } /* * 静态成员式内部类 该内部类的实例对象与外部类的实例无绑定关系 * 有且只有在LazyInitializationHolder被调用instance时 在会对对象实例进行装载 * 从而实现延时加载 */ private static class LazyInitializationHolder { /* * 静态初始化器 由JVM保证线程安全 * */ private static LazyInitializationHolderClassSingleton instance = new LazyInitializationHolderClassSingleton(); } //创建实例 public static LazyInitializationHolderClassSingleton getInstance() { return LazyInitializationHolder.instance; } }
七、枚举实现单例
package com.java.singleton; public enum EnumSingleton { //枚举类的每个元素 都代表一个单例 uniqueEnumSingleton; public void method() { System.out.println("EnumSingleton"+uniqueEnumSingleton.hashCode()); } }
八、测试类
package com.java.singleton; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class SingletonApplicationTests { @Test public void testCacheSingleton() { for (int i = 0; i < 3; i++) { System.out.println("CacheSingleton\t" + CacheSingleton.getInstance()); } System.out.println("-------------------------------------------------------------------\n"); } @Test public void testDoubleCheckedLockingSingleton() { for (int i = 0; i < 3; i++) { System.out.println("DoubleCheckedLockingSingleton\t" + DoubleCheckedLockingSingleton.getInstance()); } System.out.println("-------------------------------------------------------------------\n"); } @Test public void testEnumSingleton() { for (int i = 0; i < 3; i++) { EnumSingleton.uniqueEnumSingleton.method(); } System.out.println("-------------------------------------------------------------------\n"); } @Test public void testHungrySingleton() { for (int i = 0; i < 3; i++) { System.out.println("HungrySingleton\t" + HungrySingleton.getInstance()); } System.out.println("-------------------------------------------------------------------\n"); } @Test public void testLazyInitializationHolderClassSingleton() { for (int i = 0; i < 3; i++) { System.out.println("LazyInitializationHolderClassSingleton\t" + LazyInitializationHolderClassSingleton.getInstance()); } System.out.println("-------------------------------------------------------------------\n"); } @Test public void testLazySingleton() { for (int i = 0; i < 3; i++) { System.out.println("LazySingleton\t" + LazySingleton.getInstance()); } System.out.println("-------------------------------------------------------------------\n"); } @Test public void testSynchronizedLazySingleton() { for (int i = 0; i < 3; i++) { System.out.println("SynchronizedLazySingleton\t" + SynchronizedLazySingleton.getInstance()); } System.out.println("-------------------------------------------------------------------\n"); } }
九、测试结果
一、懒汉式(线程不安全)
package com.java.singleton; //懒汉式 线程不安全 public class LazySingleton { //私有构造方法 只允许在内部进行实例的创建 private LazySingleton() { } private static LazySingleton instance = null; //创建实例 public static LazySingleton getInstance() { if (instance == null) { instance = new LazySingleton(); } return instance; } }
二、懒汉式(线程安全)
package com.java.singleton; //懒汉式 线程安全 public class SynchronizedLazySingleton { //私有构造方法 只允许在内部进行实例的创建 private SynchronizedLazySingleton() { } private static SynchronizedLazySingleton instance = null; //创建实例 线程安全 public static synchronized SynchronizedLazySingleton getInstance() { if (instance == null) { instance = new SynchronizedLazySingleton(); } return instance; } }
三、饿汉式(线程安全)
package com.java.singleton; //饿汉式 public class HungrySingleton { //私有构造方法 只允许在内部进行实例的创建 private HungrySingleton() { } //静态初始化 由JVM保证线程安全 private static HungrySingleton instance = new HungrySingleton(); //创建实例 public static HungrySingleton getInstance() { return instance; } }
四、缓存实现(线程不安全)
package com.java.singleton; import java.util.HashMap; import java.util.Map; //线程不安全 缓存实现 public class CacheSingleton { //私有构造方法 只允许在内部进行实例的创建 private CacheSingleton() { } //构造缓存容器 private static Map<String, CacheSingleton> map = new HashMap<>(); //构造默认的存放key private static final String DEFAULT_KEY = "Cache"; //创建实例 public static CacheSingleton getInstance() { //先从缓存中取 没有就创建并放入缓存 有就返回 CacheSingleton instance = (CacheSingleton) map.get(DEFAULT_KEY); if (instance == null) { instance = new CacheSingleton(); map.put(DEFAULT_KEY, instance); } return instance; } }
五、双重检查加锁(懒汉式 线程安全的进一步优化)
package com.java.singleton; //双重检查加锁 懒汉式在方法上加synchronized的进一步优化 public class DoubleCheckedLockingSingleton { //私有构造方法 只允许在内部进行实例的创建 private DoubleCheckedLockingSingleton() { } //volatile 修饰的变量不会被本地线程缓存 对该变量的读写直接作用于共享内存 类似于互斥锁 private volatile static DoubleCheckedLockingSingleton instance = null; //创建实例 public static DoubleCheckedLockingSingleton getInstance() { if (instance == null) { synchronized (DoubleCheckedLockingSingleton.class) { if (instance == null) { instance = new DoubleCheckedLockingSingleton(); } } } return instance; } }
六、 Lazy Initialization Holder Class实现单例
package com.java.singleton; //静态内部类 Lazy Initialization Holder Class public class LazyInitializationHolderClassSingleton { //私有构造方法 只允许在内部进行实例的创建 private LazyInitializationHolderClassSingleton() { } /* * 静态成员式内部类 该内部类的实例对象与外部类的实例无绑定关系 * 有且只有在LazyInitializationHolder被调用instance时 在会对对象实例进行装载 * 从而实现延时加载 */ private static class LazyInitializationHolder { /* * 静态初始化器 由JVM保证线程安全 * */ private static LazyInitializationHolderClassSingleton instance = new LazyInitializationHolderClassSingleton(); } //创建实例 public static LazyInitializationHolderClassSingleton getInstance() { return LazyInitializationHolder.instance; } }
七、枚举实现单例
package com.java.singleton; public enum EnumSingleton { //枚举类的每个元素 都代表一个单例 uniqueEnumSingleton; public void method() { System.out.println("EnumSingleton"+uniqueEnumSingleton.hashCode()); } }
八、测试类
package com.java.singleton; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class SingletonApplicationTests { @Test public void testCacheSingleton() { for (int i = 0; i < 3; i++) { System.out.println("CacheSingleton\t" + CacheSingleton.getInstance()); } System.out.println("-------------------------------------------------------------------\n"); } @Test public void testDoubleCheckedLockingSingleton() { for (int i = 0; i < 3; i++) { System.out.println("DoubleCheckedLockingSingleton\t" + DoubleCheckedLockingSingleton.getInstance()); } System.out.println("-------------------------------------------------------------------\n"); } @Test public void testEnumSingleton() { for (int i = 0; i < 3; i++) { EnumSingleton.uniqueEnumSingleton.method(); } System.out.println("-------------------------------------------------------------------\n"); } @Test public void testHungrySingleton() { for (int i = 0; i < 3; i++) { System.out.println("HungrySingleton\t" + HungrySingleton.getInstance()); } System.out.println("-------------------------------------------------------------------\n"); } @Test public void testLazyInitializationHolderClassSingleton() { for (int i = 0; i < 3; i++) { System.out.println("LazyInitializationHolderClassSingleton\t" + LazyInitializationHolderClassSingleton.getInstance()); } System.out.println("-------------------------------------------------------------------\n"); } @Test public void testLazySingleton() { for (int i = 0; i < 3; i++) { System.out.println("LazySingleton\t" + LazySingleton.getInstance()); } System.out.println("-------------------------------------------------------------------\n"); } @Test public void testSynchronizedLazySingleton() { for (int i = 0; i < 3; i++) { System.out.println("SynchronizedLazySingleton\t" + SynchronizedLazySingleton.getInstance()); } System.out.println("-------------------------------------------------------------------\n"); } }
九、测试结果
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 设计模式——订阅模式(观察者模式)
- 设计模式-简单工厂、工厂方法模式、抽象工厂模式
- java23种设计模式-门面模式(外观模式)
- 设计模式-享元设计模式
- Java 设计模式之工厂方法模式与抽象工厂模式
- JAVA设计模式之模板方法模式和建造者模式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
深入理解LINUX网络技术内幕
Christian Benvenuti / 夏安、闫江毓、黄景昌 / 中国电力出版社 / 2009-6 / 128.00元
Linux如此的流行正是得益于它的特性丰富及有效的网络协议栈。如果你曾经惊叹于Linux能够实现如此复杂的工作,或者你只是想通过现实中的例子学习现代网络,《深入理解Linux网络内幕》将会给你指导。同其他O'Reilly的流行书籍一样,《深入理解Linux网络内幕》清楚地阐述了网络的基本概念,并指导你如何用C语言实现。虽然早先的 TCP/IP经验是有用的,但初学者通过《深入理解Linux网络内幕》......一起来看看 《深入理解LINUX网络技术内幕》 这本书的介绍吧!
CSS 压缩/解压工具
在线压缩/解压 CSS 代码
图片转BASE64编码
在线图片转Base64编码工具