1.饿汉模式
package com.john.learn.high.concurent.ch04.singleton;
public class StarvationSingleton {
public StarvationSingleton() {
System.out.println("Starvation Singleton is created...");
}
public static StarvationSingleton getInstance() {
return instance;
}
private static StarvationSingleton instance = new StarvationSingleton();
}
2. 懒汉模式
package com.john.learn.high.concurent.ch04.singleton;
public class LazySingleton {
public LazySingleton() {
System.out.println("LazySingleton Singleton is created...");
}
public static LazySingleton getInstance() {
if (instance != null) {
return instance;
}
synchronized (LazySingleton.class) {
if (instance == null) {
instance = new LazySingleton();
}
}
return instance;
}
private static LazySingleton instance;
}
3. 优化单利模式1
package com.john.learn.high.concurent.ch04.singleton;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class FreeLazySingleton {
public FreeLazySingleton() {
System.out.println("FreeLazySingleton is created...");
}
public static synchronized FreeLazySingleton getInstance() {
return FreeLazySingletonHolder.getInstance();
}
private static class FreeLazySingletonHolder {
private static FreeLazySingleton instance = new FreeLazySingleton();
public static FreeLazySingleton getInstance() {
return instance;
}
}
private static FreeLazySingleton instance;
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
executorService.submit(new Runnable() {
@Override
public void run() {
FreeLazySingleton.getInstance();
}
});
}
executorService.shutdown();
}
}
4. 优化单利模式2 (CAS)
package com.john.learn.high.concurent.ch04.singleton;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
public class FreeLockSingleton {
public FreeLockSingleton() {
System.out.println("FreeLockSingleton is created...");
}
public static FreeLockSingleton getInstance() {
if (instance != null) {
return instance;
}
for (;;) {
if (createInstanceCertificate.compareAndSet(false, true)) {
instance = new FreeLockSingleton();
}
if (instance != null) {
return instance;
}
}
}
private static FreeLockSingleton instance = null;
private static AtomicBoolean createInstanceCertificate = new AtomicBoolean();
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
executorService.submit(new Runnable() {
@Override
public void run() {
FreeLockSingleton.getInstance();
}
});
}
executorService.shutdown();
}
}