Singleton2实现单例模式,懒汉式
class Singleton2{
private Singleton2(){}
private static Singleton2 singleton2;
public static Singleton2 getSingle2(){
if(singleton2 == null){
//这边模拟线程等待
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
singleton2 = new Singleton2();
}
return singleton2;
}
}
main方法
public static void main(String[] args) throws InterruptedException {
//线程1
new Thread(){
@Override
public void run() {
Singleton2 s1 = Singleton2.getSingle2();
System.out.println("线程1:"+s1);
}
}.start();
//线程2
new Thread(){
@Override
public void run() {
Singleton2 s1 = Singleton2.getSingle2();
System.out.println("线程2"+s1);
}
}.start();
}
运行结果:获取的两个实力不一致,单例模式失效。
解决多线程下,懒汉式的线程安全问题
1、使用synchronized同步代码块
2、使用synchronized同步方法
class Singleton2{
private Singleton2(){}
private static Singleton2 singleton2;
//解决多线程下懒汉式问题,使用synchronized同步方法
public static synchronized Singleton2 getSingle2(){
//解决多线程下的懒汉式问题,使用synchronized同步代码块
// synchronized (Singleton2.class) {
if(singleton2 == null){
//这边模拟线程等待
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
singleton2 = new Singleton2();
}
// }
return singleton2;
}
}