单例模式的懒汉式是线程不安全的,下面给出测试代码,使用的是Callable和FutureTask实现的
public class SingletonTest03 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
System.out.println("懒汉式,线程不安全的");
//下面通过Callable接口和FutureTask来实现
Callable<Singleton> singletonCallable = () -> {
Singleton singleton=Singleton.getInstance();
return singleton;
};
Callable<Singleton> singletonCallable1 = () -> {
Singleton singleton=Singleton.getInstance();
return singleton;
};
FutureTask<Singleton> ft = new FutureTask<>(singletonCallable);
FutureTask<Singleton> ft1 = new FutureTask<>(singletonCallable1);
new Thread(ft).start();
new Thread(ft1).start();
Singleton singleton = ft.get();
Singleton singleton1 = ft1.get();
System.out.println(singleton1==singleton);
}
}
class Singleton {
private static Singleton instance;
private Singleton() {
}
//提供一个静态的公有方法,当使用到该方法时,才会去创建instance
//即懒汉式
//如果要改成线程安全的懒汉式,只需要在下面方法的static后面添加synchronized字段即可
//public static synchronized Singleton getInstance() {
public static Singleton getInstance() {
if (instance == null) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
instance = new Singleton();
}
return instance;
}
}