<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] ## 1. 單例模式 ### 1.1 餓漢模式 > * 餓漢模式 優點是:寫起來比較簡單,而且不存在多線程同步問題,避免了synchronized所造成的性能問題; 缺點是:當類SingletonTest被加載的時候,會初始化static的instance,靜態變量被創建并分配內存空間,從這以后,這個static的instance對象便一直占著這段內存(即便你還沒有用到這個實例),當類被卸載時,靜態變量被摧毀,并釋放所占有的內存,因此在某些特定條件下會耗費內存。 ~~~ /** * 方法一 * 單例模式的實現:餓漢式,線程安全 但效率比較低 */ public class SingletonTest { // 1. 定義一個私有的構造方法 private SingletonTest() { } // 2. 將自身的實例對象設置為一個屬性,并加上Static和final修飾符 private static final SingletonTest instance = new SingletonTest(); // 3. 靜態方法返回該類的實例 public static SingletonTest getInstancei() { return instance; } } ~~~ * * * * * ### 1.2 飽漢模式 ~~~ /** * * 單例模式的實現:飽漢式,線程安全簡單實現 * */ public class SingletonTest { // 定義一個私有構造方法 private SingletonTest() { } //定義一個靜態私有變量(不初始化,不使用final關鍵字,使用volatile保證了多線程訪問時instance變量的可見性,避免了instance初始化時其他變量屬性還沒賦值完時,被另外線程調用) private static volatile SingletonTest instance; //定義一個共有的靜態方法,返回該類型實例 public static SingletonTest getIstance() { // 對象實例化時與否判斷(不使用同步代碼塊,instance不等于null時,直接返回對象,提高運行效率) if (instance == null) { //同步代碼塊(對象未初始化時,使用同步代碼塊,保證多線程訪問時對象在第一次創建后,不再重復被創建) synchronized (SingletonTest.class) { //未初始化,則初始instance變量 if (instance == null) { instance = new SingletonTest(); } } } return instance; } } ~~~ ### 1.3 靜態內部類創建單例對象(推薦) 通過將這個單實例的引用變量定義在靜態內部類中,來實現單例,這樣可以做到不用if條件進行判斷,并且是多線程安全的(由jvm保證)。 1. 內部類可以無限制的訪問外圍類的成員(變量和方法) 2. 線程安全(保證在多線程的情況下單例) 3. 靜態內部類(包括非靜態),不會隨著外圍類的加載而加載,只有用到時(惰性)才加載,并只會被加載一次(保證單例) ~~~ package JavaTest.SingletonTest; /** * Created by dailin on 2017/11/23. */ public class SingleTest { //定義一個內部類 private static class NestClass { private static SingleTest instance; //利用靜態代碼塊,對外圍類初始化 static { System.out.println("靜態內部類NestClass靜態代碼塊執行。。。。。"); System.out.println("instance = new SingletonTest()。。。。。。"); instance = new SingleTest(); } } // 不能直接new private SingleTest() { System.out.println("private SingletonTest()"); } public static SingleTest getInstance() { System.out.println("SingletonTest getInstance()"); return NestClass.instance; } public static void main(String[] args) { SingleTest instance = SingleTest.getInstance(); System.out.println("========================================"); SingleTest instance01 = SingleTest.getInstance(); System.out.println("========================================"); SingleTest instance02 = SingleTest.getInstance(); System.out.println(instance01 == instance); } } ~~~ 例2:通過內部類實現 KeyStore 對象的單例 ~~~ package cn.com.bigssl.crypto; import com.aexit.motordriver.commons.utils.TimingDBConnection; import java.io.FileInputStream; import java.io.InputStream; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.PrivateKey; import java.security.cert.X509Certificate; import java.util.Enumeration; public class TimingCertificate { private PrivateKey privateKey; private String SerialNumber; // 直接Nested.keyStore使用 static class Nested{ static KeyStore keyStore = null; static String passwd = "1"; static { String osType = System.getProperty("os.name"); String path = System.getProperty("user.home") + "/application/jilinax.pfx"; try { keyStore = KeyStore.getInstance("PKCS12"); InputStream input = new FileInputStream(path); keyStore.load(input, passwd.toCharArray()); } catch (Exception e) { e.printStackTrace(); } } } public void readPfx() throws Exception { Enumeration<String> aliases = Nested.keyStore.aliases(); if (!aliases.hasMoreElements()) throw new RuntimeException("no alias found"); String alias = aliases.nextElement(); X509Certificate cert = (X509Certificate) Nested.keyStore.getCertificate(alias); SerialNumber = cert.getSerialNumber().toString();//序列號 SerialNumber = Long.toHexString(Long.parseLong(SerialNumber)).toUpperCase(); privateKey = (PrivateKey) Nested.keyStore.getKey(alias, Nested.passwd.toCharArray());//私鑰 } public PrivateKey getPrivateKey() { return privateKey; } public String getSerialNumber() { return SerialNumber; } public static void main(String[] args){ System.out.println(System.getProperty("user.home")); } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看