1. 程式人生 > >單例設計模式的設計——Volatile+Double-Check

單例設計模式的設計——Volatile+Double-Check

package SingleInstanceModel;
import java.net.Socket;
import java.sql.Connection;
/**
 * Created by JYM on 2019/1/8
 * 單例模式:Volatile+Double-Check
 * Double-Check雖然是一種巧妙的程式設計,但是有可能會引起類成員變數的例項化connection和socket發生在instance例項化之後,
 * 這一切均是由於JVM在執行時指令重排序所導致的,而volatile關鍵字則可以防止這種重排序的繁盛,因此程式碼稍作修改即可滿足多執行緒
 * 下的單例、懶載入以及獲取例項的高效性。
 * */

//final不允許被繼承
public final class Singleton_3_Volatile
{
    //例項變數
    private byte[] data = new byte[1024];

    private volatile static Singleton_3_Volatile instance = null;

    Connection connection;
    Socket socket;

    private Singleton_3_Volatile()
    {
        this.connection   //初始化connection
        this.socket    //初始化socket
    }

    public static Singleton_3_Volatile getInstance()
    {
        //當instance為null時,進入同步程式碼塊,同時該判斷避免了每次都需要進入同步程式碼塊,可以提高效率
        if (null == instance)
        {
            //只有一個執行緒能夠獲得Singleton.class關聯的monitor
            synchronized (Singleton_3.class)
            {
                //判斷如果instance為null則建立
                if (null==instance)
                {
                    instance = new Singleton_3_Volatile();
                }
            }
        }
        return instance;
    }
}