1.线程不同步懒汉式
代码如下
package singleton;
public class SingletonTest {
public static void main(String[] args) {
Singleton1 instance1 = Singleton1.getInstance();
Singleton1 instance2 = Singleton1.getInstance();
System.out.println(instance1 == instance2);
System.out.println(instance1.hashCode());
System.out.println(instance2.hashCode());
}
}
class Singleton1{
private static Singleton1 instance;
private Singleton1(){
}
//提供一个静态公有方法,当使用到该方法时,才去创建instance
//即懒汉式
public static Singleton1 getInstance(){
//线程不安全,当多个线程同时进入的时候,会造成多个不同对象产生
if (instance==null){
instance = new Singleton1();
}
return instance;
}
}
优缺点:实现了懒加载,只有当使用getInstance时才会产生对象,不会造成内存浪费,但是会产生线程不安全的问题。
注:实际开发中不推荐使用
2.线程同步懒汉式
代码如下
package singleton;
public class SingletonTest {
public static void main(String[] args) {
Singleton1 instance1 = Singleton1.getInstance();
Singleton1 instance2 = Singleton1.getInstance();
System.out.println(instance1 == instance2);
System.out.println(instance1.hashCode());
System.out.println(instance2.hashCode());
}
}
class Singleton1{
private static Singleton1 instance;
private Singleton1(){
}
//提供一个静态公有方法,当使用到该方法时,才去创建instance
//即懒汉式
//加入了同步代码,解决了线程不同步问题
public static synchronized Singleton1 getInstance(){
//线程不安全,当多个线程同时进入的时候,会造成多个不同对象产生
if (instance==null){
instance = new Singleton1();
}
return instance;
}
}
优缺点:解决了线程不同步的问题,但是效率太低,每次想获得一个实例的时候都要去同步,实际上第一个获得实例后直接return 后续的线程就可以直接获得。
注:实际开发中不推荐使用