同步:并發(fā)

2019-07-07 23:44 更新
同步:并發(fā)。多個(gè)線程同時(shí)訪問(wèn)同一份資源,確保資源安全,即線程安全。


鎖:每個(gè)對(duì)象都有且只有一把鎖。

一、同步塊:

synchronized (對(duì)象) {


}
注:
括號(hào)內(nèi)放的是對(duì)象,類.class也是對(duì)象。

二、同步方法

public synchronized void function1() {
    //普通成員方法默認(rèn)獲得的是當(dāng)前對(duì)象的鎖。
}


public static synchronized void function1() {
    //靜態(tài)方法默認(rèn)獲得的是當(dāng)前類的鎖,即類.class的鎖。
}

單例模式的應(yīng)用: 1.懶漢式

/**
 * 懶漢式
 * 1.構(gòu)造器私有化。
 * 2.聲明私有的靜態(tài)屬性。
 * 3.對(duì)外提供訪問(wèn)屬性的靜態(tài)方法,確保對(duì)象存在。
 * */
class MyJvm{
    private static MyJvm instance;
    private MyJvm() {}
    public static MyJvm getInstance() {
        if(instance == null) {//提供效率
            synchronized (MyJvm.class) {
                if(instance == null) {//安全
                    instance = new MyJvm();
                }
            }
        }
        return instance;
    }
}

2.餓漢式

/**
 * 餓漢式
 * 1.構(gòu)造器私有化。
 * 2.聲明私有的靜態(tài)屬性,同時(shí)創(chuàng)建該對(duì)象。
 * 3.對(duì)外提供訪問(wèn)屬性的靜態(tài)方法。
 * 靜態(tài)成員會(huì)在加載類的時(shí)候就被初始化,因此可以直接獲取。但有時(shí)使用MyJvm的其他方法時(shí)但不想實(shí)例化是做不到的,可以使用第三種方法。
 * 可參考static關(guān)鍵字知識(shí)點(diǎn)。
 * */
class MyJvm{
    private static MyJvm instance = new MyJvm();
    private MyJvm() {}
    public static MyJvm getInstance() {
        return instance;
    }
}

3.延遲加載

/**
 * 延遲加載
 * 當(dāng)使用JvmHolder類時(shí)才會(huì)初始化instance,延緩加載時(shí)間。
 * 這樣在使用MyJvm的其他方法時(shí)就不會(huì)實(shí)例化instance。
 * */
class MyJvm{
    private static class JvmHolder{
        private static MyJvm instance = new MyJvm();
    }
    private MyJvm() {}
    public static MyJvm getInstance() {
        return JvmHolder.instance;
    }
}
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)