單例設計模式的設計——Volatile+Double-Check
阿新 • • 發佈:2019-01-09
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; } }