懒汉式单单线程下的实现
package com.wangming.pattern.creational.singleton;
/**
* @Auther: ming.wang
* @Date: 2019/1/6 19:25
* @Description:
*/
public class LazySingleton {
private static LazySingleton lazySingleton=null;
private LazySingleton() {
}
public static LazySingleton getInstance(){
if (null==lazySingleton)
{
lazySingleton=new LazySingleton();
}
return lazySingleton;
}
}
上述代码在单线程条件下是没有问题的,但是在多线程下是无法保证线程安全的。让我们使用一个实用技能多线程debug
来复现一下这个问题。
让我们写一个测试类
package com.wangming.pattern.creational.singleton;
/**
* @Auther: ming.wang
* @Date: 2019/1/6 19:27
* @Description:
*/
public class Test {
public static void main(String[] args) {
// LazySingleton lazySingleton = LazySingleton.getInstance();
Thread t1 = new Thread(new T());
Thread t2 = new Thread(new T());
t1.start();
t2.start();
System.out.println("=========");
}
}
class T implements Runnable {
@Override
public void run() {
LazySingleton lazySingleton = LazySingleton.getInstance();
System.out.println(Thread.currentThread().getName() + " " + lazySingleton);
}
}
然后debug运行

那么问题出现了,我们改如何解决呢?其实很简单,只要在getInstance方法加上synchronized关键字
public class LazySingleton {
private static LazySingleton lazySingleton=null;
private LazySingleton() {
}
public synchronized static LazySingleton getInstance(){
if (null==lazySingleton)
{
lazySingleton=new LazySingleton();
}
return lazySingleton;
}
通过加synchronized关键字,这样就解决了懒汉式在多线程下的问题了。
我们知道同步锁是比较耗资源的,那么我们有没有优化的余地了呢?下篇文章,咱们一起分析一下。
网友评论