java并發(fā)知識(shí)的體系如下:
多線程編程中,會(huì)出現(xiàn)臨界資源的被多個(gè)線程同時(shí)訪問(wèn)的情況,由于線程執(zhí)行的過(guò)程是不可控的,所以需要采用同步機(jī)制來(lái)進(jìn)行臨界資源的訪問(wèn)。由此引出來(lái)鎖機(jī)制,加鎖的目的是,串行化訪問(wèn)臨界資源,任一時(shí)刻只有一個(gè)線程可以獲取資源。java中的鎖如下分類
同步static類方法,鎖的是當(dāng)前實(shí)例對(duì)象
同步類方法,鎖的是當(dāng)前對(duì)象
同步代碼塊,鎖的是括號(hào)里面的對(duì)象
private static int count = 0;
public static void main(String[] args) {for (int i = 0; i<10 ; i++) {Thread thread = new Thread(new Runnable() {@Override
public void run() { TestAQS testAQS = new TestAQS();
testAQS.test1();
}
});
thread.start();
}
}
public static synchronized void test(){count++;
System.out.println("count的值是:"+count);
}
public synchronized void test1(){count++;
System.out.println("count的值是:"+count);
}
我們可以看到當(dāng)前類加synchronized 如果不是單例的那么會(huì)導(dǎo)致失效,所以此時(shí)要用到單例模式,保證對(duì)象只有一個(gè)
private static int count = 0;
public static void main(String[] args) {for (int i = 0; i<10 ; i++) {Thread thread = new Thread(new Runnable() {@Override
public void run() { TestAQS testAQS = getInstance();
testAQS.test1();
}
});
thread.start();
}
}
public static synchronized void test(){count++;
System.out.println("count的值是:"+count);
}
public synchronized void test1(){count++;
System.out.println("count的值是:"+count);
}
private static volatile TestAQS instance = null;
private TestAQS() {}
public static TestAQS getInstance() {if (instance == null) {synchronized (TestAQS.class) {if (instance == null) {instance = new TestAQS();
}
}
}
return instance;
}
底層原理:
JVM內(nèi)置鎖通過(guò)synchronized 使用,通過(guò)內(nèi)部對(duì)象Monitor(監(jiān)視器鎖)實(shí)現(xiàn),基于進(jìn)入和退出Monitor對(duì)象實(shí)現(xiàn)方法與代碼塊同步,監(jiān)視器鎖的實(shí)體依賴底層操作系統(tǒng)Mutex Lock(互斥鎖)實(shí)現(xiàn)。
volatile保證了變量的可見(jiàn)性,不能保證變量的原子性。
volatile關(guān)鍵字可以禁止指令重排,保證代碼前后執(zhí)行順序。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧