单例模式
package com.songlin.designpattern.lazysingleton;
public class LazySingletonTest {
public static void main(String[] args) {
new Thread( () ->{
LazySingleton instance = LazySingleton.getInstance();
System.out.println(instance);
}
).start();
new Thread( () ->{
LazySingleton instance = LazySingleton.getInstance();
System.out.println(instance);
}).start();
}
}
class LazySingleton{
private static LazySingleton instance;
private LazySingleton(){
}
public synchronized static LazySingleton getInstance(){
if (instance == null){
synchronized (LazySingleton.class){
if (instance == null){
instance = new LazySingleton();
}
}
}
return instance;
}
}
饿汉加载
package com.songlin.designpattern.hungrysingleton;
public class HungerySingletonTest {
public static void main(String[] args) {
HungerySingleton instance = HungerySingleton.getInstance();
HungerySingleton instancel = HungerySingleton.getInstance();
System.out.println(instance == instancel);
}
}
class HungerySingleton{
private static HungerySingleton instance = new HungerySingleton();
private HungerySingleton(){
}
public static HungerySingleton getInstance(){
return instance;
}
}
反射
package com.songlin.designpattern.innerclasssingleton;
import org.junit.Test;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class InnerSingletonTest {
@Test
public void test1 () {
InnerClassSingleton instance = InnerClassSingleton.getInstance();
InnerClassSingleton internal = InnerClassSingleton.getInstance();
System.out.println(instance == internal);
System.out.println("---------------------------");
new Thread(() -> {
InnerClassSingleton instance2 = InnerClassSingleton.getInstance();
System.out.println(instance2.hashCode());
}).start();
new Thread(() -> {
InnerClassSingleton instance2 = InnerClassSingleton.getInstance();
System.out.println(instance2.hashCode());
}).start();
}
@Test
public void test2() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
Constructor<InnerClassSingleton> declaredConstructor = InnerClassSingleton.class.getDeclaredConstructor();
declaredConstructor.setAccessible(true);
InnerClassSingleton innerClassSingleton = declaredConstructor.newInstance();
InnerClassSingleton instance = InnerClassSingleton.getInstance();
System.out.println(instance == innerClassSingleton);
}
}
class InnerClassSingleton{
private static class InnerClassHolder{
private static InnerClassSingleton innerClassSingleton = new InnerClassSingleton();
}
private InnerClassSingleton(){
}
public static InnerClassSingleton getInstance(){
return InnerClassHolder.innerClassSingleton;
}
}
enum
package com.songlin.designpattern.enumsingleton;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public enum EnumSingleton {
INSTANCE;
public void print(){
System.out.println(INSTANCE.hashCode());
}
}
class EnumTest{
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
Constructor<EnumSingleton> declaredConstructor = EnumSingleton.class.getDeclaredConstructor(String.class, int.class);
declaredConstructor.setAccessible(true);
declaredConstructor.newInstance("INSTANCE",0);
}
}
通过流的读取
package com.songlin.designpattern.innerclasssingleton;
import org.junit.Test;
import javax.sound.midi.Synthesizer;
import java.io.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class InnerSingletonTest {
@Test
public void test1 () {
InnerClassSingleton instance = InnerClassSingleton.getInstance();
InnerClassSingleton internal = InnerClassSingleton.getInstance();
System.out.println(instance == internal);
System.out.println("---------------------------");
new Thread(() -> {
InnerClassSingleton instance2 = InnerClassSingleton.getInstance();
System.out.println(instance2.hashCode());
}).start();
new Thread(() -> {
InnerClassSingleton instance2 = InnerClassSingleton.getInstance();
System.out.println(instance2.hashCode());
}).start();
}
@Test
public void test2() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
Constructor<InnerClassSingleton> declaredConstructor = InnerClassSingleton.class.getDeclaredConstructor();
declaredConstructor.setAccessible(true);
InnerClassSingleton innerClassSingleton = declaredConstructor.newInstance();
InnerClassSingleton instance = InnerClassSingleton.getInstance();
System.out.println(instance == innerClassSingleton);
}
@Test
public void test3() throws IOException, ClassNotFoundException {
InnerClassSingleton instance = InnerClassSingleton.getInstance();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("testSerializable"));
InnerClassSingleton o = (InnerClassSingleton) ois.readObject();
System.out.println(instance == o);
}
}
class InnerClassSingleton implements Serializable {
private static class InnerClassHolder{
private static InnerClassSingleton innerClassSingleton = new InnerClassSingleton();
}
private InnerClassSingleton(){
}
public static InnerClassSingleton getInstance(){
return InnerClassHolder.innerClassSingleton;
}
}