同步:并發(fā)

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


鎖:每個對象都有且只有一把鎖。

一、同步塊:

synchronized (對象) {


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

二、同步方法

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


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

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

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

3.延遲加載

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號