黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

Java多線程編程概述
Java多線程的安全問題
Java多線程同步
Java多線程間的通信
Java線程Lock
Java多線程管理
保障線程安全的設計技術
Java鎖的優化及注意事項
Java多線程集合
【Java多線程】單例模式與多線程

Java單例模式懶漢和餓漢式

單例設計模式是最常用的設計模式之一.單例模式提供了一種在多線程環境中保證實例唯一性的解決方案。

餓漢模式

餓漢模式也叫立即加載模式,立即加載就是在使用類時就已經將對象初始化完畢。

package com.wkcto.sigleton.p1;

/**
 * 餓漢單例模式
 *  在類加載內存時就給對象初始化,具有固有的線程安全性
 *  餓漢模式適用于成員屬性比較少,占用內存資源不多的情況
 */
public class Test {
    public static void main(String[] args) {
        //創建10個線程, 在每個 線程中打印單例對象
        for (int i = 0; i < 10; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    //調用Singleton.getInstance()返回單例對象,打印會輸出對象的哈希碼
                    System.out.println(Singleton.getInstance());
                }
            }).start();
        }
        //程序運行后,輸出單例的哈希碼都相同,說明是同一個對象
    }
}
package com.wkcto.sigleton.p1;

import java.util.Random;

/**
 * 單例類
 */
public class Singleton {
    //在使用Singleton單例類時,就給靜態變量obj初始化. 在類加載內存時就已經對類的實例初始化完畢,保證在多線程環境中的唯一
    private static Singleton obj = new Singleton();
    private Singleton(){}
    public static Singleton getInstance(){
        try {
            Thread.sleep(new Random().nextInt(50));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return obj;
    }
}
懶漢模式

懶漢模式也稱為延遲加載. 延遲加載就是在第一次調用get()方法時才給實例進行初始化。

package com.wkcto.sigleton.p2;

/**
 * 測試單例模式
 */
public class Test {
    public static void main(String[] args) {
        //創建10個線程, 在每個 線程中打印單例對象
        for (int i = 0; i < 10; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    //調用Singleton.getInstance()返回單例對象,打印會輸出對象的哈希碼
                    System.out.println(Singleton.getInstance());
                }
            }).start();
        }
    }
}
package com.wkcto.sigleton.p2;

import java.util.Random;

/**
 * 懶漢單例
 *  不是線程安全的
 */
public class Singleton1 {
    //定義本類實例,不初始化
    private static Singleton1 obj;
    private Singleton1(){}
    //在第一次調用getInstance()方法時,判斷obj是否為null,如果obj為null就進行初始化
    public static Singleton1 getInstance(){
        if ( obj == null ){
            try {
                Thread.sleep(new Random().nextInt(50));     //睡眠,模擬多線程執行需要的時間,
                //加上睡眠后,運行結果可能會出現多個實例的情況,這種延遲加載不是線程安全的
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            obj = new Singleton1();
        }
        return obj;
    }
}
package com.wkcto.sigleton.p2;

import java.util.Random;

/**
 * 懶漢單例
 *  既然多個 線程可以同時調用getInstance()方法,只需要對該方法進行同步即可
 *  對整個方法進行了同步,并發效率低,即一個線程必須等上個線程釋放鎖之后才能取得 鎖對象獲得單例
 */
public class Singleton2 {
    //定義本類實例,不初始化
    private static Singleton2 obj;
    private Singleton2(){}
    //在第一次調用getInstance()方法時,判斷obj是否為null,如果obj為null就進行初始化
    public static synchronized Singleton2 getInstance(){
        if ( obj == null ){
            try {
                Thread.sleep(new Random().nextInt(50));     //睡眠,模擬多線程執行需要的時間,
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            obj = new Singleton2();
        }
        return obj;
    }
}
package com.wkcto.sigleton.p2;

import java.util.Random;

/**
 * 懶漢單例
 *  直接同步getInstance()方法,并發效率低,可以只針對部分重要代碼進行同步
 *  即只針對 給obj對象初始化的語句進行同步,也可能存在線程安全問題
 */
public class Singleton3 {
    //定義本類實例,不初始化
    private static Singleton3 obj;
    private Singleton3(){}
    //在第一次調用getInstance()方法時,判斷obj是否為null,如果obj為null就進行初始化
    public static  Singleton3 getInstance(){
        if ( obj == null ){
            try {
                Thread.sleep(new Random().nextInt(50));     //睡眠,模擬多線程執行需要的時間,
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (Singleton3.class) {
                obj = new Singleton3();
            }
        }
        return obj;
    }
}
package com.wkcto.sigleton.p2;

import java.util.Random;

/**
 * 懶漢單例
 *  直接同步getInstance()方法,并發效率低,可以只針對部分重要代碼進行同步
 *  如果只針對 給obj對象初始化的語句進行同步,也可能存在線程安全問題
 *  可以采用雙檢查機制,在同步代碼塊中再次檢查obj對象是否為null
 */
public class Singleton {
    //定義本類實例,不初始化
    private static Singleton obj;
    private Singleton(){}
    //在第一次調用getInstance()方法時,判斷obj是否為null,如果obj為null就進行初始化
    public static Singleton getInstance(){
        if ( obj == null ){
            try {
                Thread.sleep(new Random().nextInt(50));     //睡眠,模擬多線程執行需要的時間,
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (Singleton.class) {
                if (obj == null) {      //再次檢查obj是否為null
                    obj = new Singleton();
                }
            }
        }
        return obj;
    }
}
全部教程
主站蜘蛛池模板: 亚洲欧美不卡中文字幕 | 狠狠色丁香久久婷婷综合五月 | 波多野结衣不卡 | 亚洲福利视频网站 | 香蕉视频老司机 | 日韩高清在线高清免费 | 毛片a区| 日韩黄色影视 | 日韩精品美女 | 欧美色图综合网 | 真实国产乱弄免费视频 | 一本无线乱码不卡一二三四 | 国产亚洲精品仙踪林在线播放 | 香蕉蕉亚亚洲aav综合 | 91成人免费观看在线观看 | 欧美日韩精品一区二区在线线 | 亚洲成人一区 | 日韩欧美亚洲综合一区二区 | 波多野结衣一区二区在线 | 看一级毛片国产一级毛片 | 亚洲综合精品一区二区三区中文 | 国产最强大片免费视频 | 国产欧美亚洲精品第二区首页 | 亚洲高清不卡视频 | 国产成人在线视频 | 9299yy看片淫黄大片在线 | 日本jizz强视频69视频 | 黄色毛片免费 | 亚洲第一精品夜夜躁人人爽 | 污视频网页 | 激情综合在线 | 中文天堂在线最新2022更新 | 日韩亚洲人成网站在线播放 | 殴美一级毛片 | 日韩在线精品视频 | 欧美色图888 | 福利所第一导航 | 99热在线观看免费 | 亚洲韩国日本欧美一区二区三区 | 99热青青草| 99热在线观看免费 |