懶漢式單單線程下的實現(xiàn)
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
來復現(xiàn)一下這個問題。
讓我們寫一個測試類
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運行那么問題出現(xiàn)了叮盘,我們改如何解決呢厢汹?其實很簡單,只要在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關鍵字塌西,這樣就解決了懶漢式在多線程下的問題了他挎。
我們知道同步鎖是比較耗資源的,那么我們有沒有優(yōu)化的余地了呢捡需?下篇文章办桨,咱們一起分析一下。