欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Java描述設(shè)計(jì)模式(01):單例模式

一、單例模式

1、概念圖解

單例設(shè)計(jì)模式定義:確保這個(gè)類只有一個(gè)實(shí)例,并且自動(dòng)的實(shí)例化向系統(tǒng)提供這個(gè)對(duì)象。

十余年的成武網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整成武建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“成武網(wǎng)站設(shè)計(jì)”,“成武網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

2、樣例代碼

package com.model.test;
public class Singleton {
    // 使用靜態(tài)變量記錄唯一實(shí)例
    private static Singleton singleton = null;
    private Singleton (){}
    public static Singleton getInstance (){
        if (singleton == null){
            singleton = new Singleton() ;
        }
        return singleton ;
    }
    public static void main(String[] args) {
        Singleton singleton1 = Singleton.getInstance() ;
        Singleton singleton2 = Singleton.getInstance() ;
        /**
         * com.model.test.Singleton@15db9742
         * com.model.test.Singleton@15db9742
         */
        System.out.println(singleton1);
        System.out.println(singleton2);
    }
}

Singleton稱為單例類,構(gòu)造函數(shù)使用private修飾,確保系統(tǒng)中只能產(chǎn)生一個(gè)實(shí)例,并且自動(dòng)生成的。上面代碼也就是所謂的懶漢式加載:只有到使用該對(duì)象的時(shí)候才來創(chuàng)建,意思餓了才來做飯吃。

二、線程安全問題

在上面的代碼中存在一個(gè)很明顯的線程安全問題,當(dāng)有多條線程來請(qǐng)求對(duì)象實(shí)例的時(shí)候,因?yàn)閷?duì)象的創(chuàng)建是需要時(shí)間的,假設(shè)A線程進(jìn)來判斷singleton == null,就會(huì)進(jìn)入對(duì)象的創(chuàng)建過程,這時(shí)如果同時(shí)在過來幾條線程,那么他們都會(huì)得到一個(gè)對(duì)象實(shí)例,這個(gè)就是所謂的線程安全問題。

1、同步控制方式

package com.model.test;
public class Singleton {
    // 使用靜態(tài)變量記錄唯一實(shí)例
    private static Singleton singleton = null;
    private Singleton (){}
    public static synchronized Singleton getInstance (){
        if (singleton == null){
            singleton = new Singleton() ;
        }
        return singleton ;
    }
}

這樣操作會(huì)影響系統(tǒng)性能

2、餓漢式加載

public class Singleton {
    // 使用靜態(tài)變量記錄唯一實(shí)例
    private static Singleton singleton = new Singleton();
    private Singleton (){}
    public static Singleton getInstance (){
        return singleton ;
    }
}

這里先把對(duì)象創(chuàng)建出來,有需要直接使用;

3、雙重檢查

public class Singleton {
    // 使用靜態(tài)變量記錄唯一實(shí)例
    // volatile可以確保當(dāng)singleton被初始化后,多線程才可以正確處理
    // 被volatile修飾的變量的值,將不會(huì)被本地線程緩存
    // 對(duì)該變量讀寫都是直接操作共享內(nèi)存,確保多個(gè)線程能正確的處理該變量。
    private static volatile Singleton singleton = null ;
    private Singleton (){}
    public static Singleton getInstance (){
        // 如果實(shí)例不存在,則進(jìn)入同步區(qū)
        if (singleton == null){
            // 只有第一次才會(huì)徹底執(zhí)行這里面的代碼
            synchronized (Singleton.class) {
                if (singleton == null){
                    singleton = new Singleton() ;
                }
            }
        }
        return singleton ;
    }
}

4、枚舉方式

package com.model.design.base.node01.singleton;
import org.junit.Test;
/**
 * 類級(jí)內(nèi)部類里面創(chuàng)建對(duì)象實(shí)例
 */
public class C06_Singleton {
 @Test
 public void test01 (){
 SingletonDemo INSTANCE1 = SingletonDemo.INSTANCE ;
 SingletonDemo INSTANCE2 = SingletonDemo.INSTANCE ;
 System.out.println(INSTANCE1 == INSTANCE2);
 INSTANCE1.info();
 INSTANCE2.info();
 }
}
enum SingletonDemo {
 INSTANCE ;
 public void info (){
 System.out.println("枚舉方式實(shí)現(xiàn)單例");
 }
}

三、延遲類初始化

1、基礎(chǔ)概念

1)、類級(jí)內(nèi)部類
簡單點(diǎn)說,類級(jí)內(nèi)部類指的是,有static修飾的成員式內(nèi)部類。如果沒有static修飾的成員式內(nèi)部類被稱為對(duì)象級(jí)內(nèi)部類。
類級(jí)內(nèi)部類相當(dāng)于其外部類的static成分,它的對(duì)象與外部類對(duì)象間不存在依賴關(guān)系,因此可直接創(chuàng)建。而對(duì)象級(jí)內(nèi)部類的實(shí)例,是綁定在外部對(duì)象實(shí)例中的。
類級(jí)內(nèi)部類中,可以定義靜態(tài)的方法。在靜態(tài)方法中只能夠引用外部類中的靜態(tài)成員方法或者成員變量。
類級(jí)內(nèi)部類相當(dāng)于其外部類的成員,只有在第一次被使用的時(shí)候才被會(huì)裝載。

2)、多線程缺省同步鎖
在多線程開發(fā)中,為了解決并發(fā)問題,主要是通過使用synchronized來加互斥鎖進(jìn)行同步控制。但是在某些情況中,JVM已經(jīng)隱含地執(zhí)行了同步,這些情況下就不用自己再來進(jìn)行同步控制了。這些情況包括:

  1.由靜態(tài)初始化器(在靜態(tài)字段上或static{}塊中的初始化器)初始化數(shù)據(jù)時(shí)
  2.訪問final字段時(shí)
  3.在創(chuàng)建線程之前創(chuàng)建對(duì)象時(shí)
  4.線程可以看見它將要處理的對(duì)象時(shí)

2、實(shí)現(xiàn)方式

要想很簡單地實(shí)現(xiàn)線程安全,可以采用靜態(tài)初始化器的方式,它可以由JVM來保證線程的安全性。比如前面的餓漢式實(shí)現(xiàn)方式,在類裝載的時(shí)候就初始化對(duì)象,不管是否需要,存在一定的空間浪費(fèi)。
一種可行的方式就是采用類級(jí)內(nèi)部類,在這個(gè)類級(jí)內(nèi)部類里面去創(chuàng)建對(duì)象實(shí)例。這樣一來,只要不使用到這個(gè)類級(jí)內(nèi)部類,那就不會(huì)創(chuàng)建對(duì)象實(shí)例,從而同時(shí)實(shí)現(xiàn)延遲加載和線程安全。

public class LazySingleton {
    /**
     * 類級(jí)內(nèi)部類
     */
    private static class SingletonHolder {
        private static LazySingleton lazySingleton = new LazySingleton() ;
    }
    public static LazySingleton getInstance (){
        return SingletonHolder.lazySingleton ;
    }
    public static void main(String[] args) {
        LazySingleton lazySingleton1 = LazySingleton.getInstance() ;
        LazySingleton lazySingleton2 = LazySingleton.getInstance() ;
        /**
         * com.model.test.LazySingleton@15db9742
         * com.model.test.LazySingleton@15db9742
         */
        System.out.println(lazySingleton1+";;"+lazySingleton2);
    }
}

四、JDK源碼單例模式

Runtime單例實(shí)現(xiàn)源碼。

1、案例演示

/**
 * JDK 單例模式分析
 */
public class C07_Singleton {
 public static void main(String[] args) {
 Runtime runtime1 = Runtime.getRuntime() ;
 Runtime runtime2 = Runtime.getRuntime() ;
 /*
 * 1229416514
 * 1229416514
 */
 System.out.println(runtime1.hashCode());
 System.out.println(runtime2.hashCode());
 }
}

2、源代碼分析

public class Runtime {
 private static Runtime currentRuntime = new Runtime();
 public static Runtime getRuntime() {
 return currentRuntime;
 }
 private Runtime() {}
}

基于餓漢模式實(shí)現(xiàn)的單例模式。

五、Spring框架中應(yīng)用

1、創(chuàng)建測試類

public class UserBean {
}

2、Spring配置文件

<!-- 單例Bean -->
<bean id="user" 
class="com.model.design.spring.node01.singleton.UserBean" />

3、測試讀取Bean對(duì)象

package com.model.design.spring.node01.singleton;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * Spring框架中單例模式
 */
public class S01_Singleton {
    @Test
    public void test01 (){
        ApplicationContext context01 = new ClassPathXmlApplicationContext("/spring/spring-context.xml");
        ApplicationContext context02 = new ClassPathXmlApplicationContext("/spring/spring-context.xml");
        UserBean user01 = (UserBean)context01.getBean("user") ;
        UserBean user02 = (UserBean)context01.getBean("user") ;
        UserBean user03 = (UserBean)context02.getBean("user") ;
        // com.model.design.spring.node01.singleton.UserBean@364841
        System.out.println(user01);
        // com.model.design.spring.node01.singleton.UserBean@364841
        System.out.println(user02);
        // com.model.design.spring.node01.singleton.UserBean@c4711c
        System.out.println(user03);
    }
}

結(jié)論
Spring單例模式與純粹的單例設(shè)計(jì)模式的主要區(qū)別
盡管使用相同的類加載器來加載兩個(gè)應(yīng)用程序上下文,但是UserBean的實(shí)例是不一樣的。也就是Spring框架中的單例對(duì)象是基于應(yīng)用程序中。

六、單例模式總結(jié)

1、注意事項(xiàng)

單例模式注意事項(xiàng)和細(xì)節(jié)說明
1) 單例模式保證了 系統(tǒng)內(nèi)存中該類只存在一個(gè)對(duì)象,節(jié)省了系統(tǒng)資源,對(duì)于一些需要頻繁創(chuàng)建銷毀的對(duì)象,使用單例模式可以提高系統(tǒng)性能。
2) 當(dāng)想實(shí)例化一個(gè)單例類的時(shí)候,必須要記住使用相應(yīng)的獲取對(duì)象的方法,而不是使用new Object() 的方式。
3) 單例模式使用的場景:需要頻繁的進(jìn)行創(chuàng)建和銷毀的對(duì)象、創(chuàng)建對(duì)象時(shí)耗時(shí)過多或耗費(fèi)資源過多(即:重量級(jí)對(duì)象),但又經(jīng)常用到的對(duì)象。

2、優(yōu)缺點(diǎn)

優(yōu)點(diǎn):
1、單例模式只會(huì)創(chuàng)建一個(gè)對(duì)象實(shí)例,減少內(nèi)存消耗
2、設(shè)置全局訪問點(diǎn),優(yōu)化共享資源的訪問
缺點(diǎn):
1、沒有接口,很難擴(kuò)展
2、不利于測試
3、與單一職責(zé)原則沖突

七、源代碼地址

GitHub地址:知了一笑
https://github.com/cicadasmile/model-arithmetic-parent
碼云地址:知了一笑
https://gitee.com/cicadasmile/model-arithmetic-parent

文章題目:Java描述設(shè)計(jì)模式(01):單例模式
分享地址:http://aaarwkj.com/article26/iicocg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、自適應(yīng)網(wǎng)站建站公司、App設(shè)計(jì)靜態(tài)網(wǎng)站、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
一区二区三区在线观看精品| 亚洲限制级电影一区二区| 特黄一级黄色大片免费看| 无人视频在线观看高清91| 国产精品国产三级国产专播精品| 欧美日韩高清一区二区三区| 国产精品一区二区一牛影视| 亚洲欧美成人高清在线观看| 另类欧美亚洲中文在线综合 | 最新国产毛片久热精品视频| 中文字幕精品人妻丝袜| 蜜臀一区二区三区精品免费| 欧美一区二区欧美精品| 久久久精品免费中文视频| 日韩黄色一级免费在线观看| 美女丝袜诱惑国产91| 亚洲视频在线男人天堂| 亚洲女同在线免费观看| 91嫩草国产在线观看| 夫妻性生活在线视频一级片| 七月丁香色婷婷婷基地| 久久伊人69日韩精品| 一本久道久久综合狠狠老| 日韩免费系列一区二区| 亚洲欧洲精品真人av蜜臀| 91成人精品永久在线观看| 91精品国产91久久综合桃花| 日本韩国欧美在线一区| 国产av高清亚洲精品高清二部 | 亚洲中文乱码一区二区| 国产精品午夜福利91| 精品亚洲综合一区二区| 国产专区亚洲精品欧美| 韩国成人伦理片在线观看| 日韩蜜桃av一二三四区| 欧美国产精品中文字幕| 人妻大乳一区二区三区| 日本精品一级免费在线| 日韩精品一区二区视频大全| 国产91对白在线观看| 欧美日韩精品免费在线观看|