前言
面試Java,必然要被問Java記憶體模型和Java併發開發。我被問到的時候,心裡慌得一批,“額,是在《Thinking in Java》裡面寫的嗎?果然每天增刪改太low了”
要了解這些圖嗎?
我希望能解釋的再簡單一些,以上都不用
Java 併發程式碼
public class Example1 {
public static int count = 0;
public static int clientTotal = 5000;
public static void main(String[] args) throws Exception {
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < clientTotal ; i++) {
executorService.execute(() -> {
try {
add();
} catch (Exception e) {
log.error("exception", e);
}
});
}
}
private static void add() {
count++;
}
}
複製程式碼
如果上面程式碼執行,count的值是多少?(為了說明重點問題,沒有寫最後列印的程式碼) 5000?多次執行的結果,count的值是小於5000的。
解釋一下上面的程式,首先定義了一個執行緒池,啟動5000個執行緒執行add()操作,add函式處理靜態成員變數count。
如果程式順序呼叫,count的值應該是5000。
for(int i=0;i<5000;i++){
add();
}
複製程式碼
但是執行緒池啟動多執行緒,是併發執行的。每個執行緒啟動之後,不管是否執行結束,下一個執行緒會馬上啟動。
啟動執行緒的過程,是一個非同步過程,啟動執行緒立即返回,啟動下一個程式。
當多個執行緒對同一個變數add進行操作的時候,就會發生寫寫衝突。
執行緒1、執行緒2 同時對值為0的變數進行操作,結果返回1,而不是2。如果這個地方想不明白,就請留言,或者看看文章頂部那些原理圖。
要不簡單點,記住“多執行緒對全域性變數的寫操作會發生衝突”。
答案,宣告原子變數 AtomicInteger count
public class CountExample2 {
// 請求總數
public static int clientTotal = 5000;
// 同時併發執行的執行緒數
public static int threadTotal = 200;
public static AtomicInteger count = new AtomicInteger(0);
public static void main(String[] args) throws Exception {
ExecutorService executorService = Executors.newCachedThreadPool();
final Semaphore semaphore = new Semaphore(threadTotal);
final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
for (int i = 0; i < clientTotal ; i++) {
executorService.execute(() -> {
try {
semaphore.acquire();
add();
semaphore.release();
} catch (Exception e) {
log.error("exception", e);
}
countDownLatch.countDown();
});
}
countDownLatch.await();
executorService.shutdown();
log.info("count:{}", count.get());
}
private static void add() {
count.incrementAndGet();
// count.getAndIncrement();
}
}
複製程式碼
注,上面的程式碼用了生成者消費者模式,5000個生產者,200個消費者,對程式併發做一定限制,防止5000個執行緒卡死計算機。
記憶體模型,也說點簡單的
-
- 棧(heap),函式載入的時候,為函式內部變數分配的空間。和父函式的內部變數和執行指標共享同一塊區域。
-
- 函式執行時,new的空間,都是放在堆中的。
這個就是C的記憶體模型,做shellcode的基礎知識。
作者:白頭雁 連結:www.jianshu.com/p/8cb84ce74…