java 併發程式設計學習筆記(一)之 基礎框架搭建和併發模擬工具,程式碼
阿新 • • 發佈:2018-12-22
基礎框架搭建和併發模擬工具,程式碼
(1)基礎框架搭建
(2)併發模擬
(3)CountDownLatch 通常用來 保證 幾個執行緒執行完成之後,再執行其他的程式碼
Semaphore 控制同一時刻的併發量
@Slf4j @NotThreadSafe public class ConcurrencyTest { //請求次數 private static int clientTotal = 5000; //允許同時執行的執行緒數 private static int threadTotal = 200; //計數 public static int count = 0; public static void main(String[] args) { 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 (InterruptedException e) { log.error("exception", e); } countDownLatch.countDown(); }); } try { countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } executorService.shutdown(); log.info("count:{}", count); } private static void add() { count++; } }
執行程式碼可以看到每次計數的結果都不一樣,並且可能不是5000,因為同一時刻200個執行緒同時執行將count加1,而count並不是對於執行緒之間可見,可能兩個執行緒在讀取count的時候結果是一樣的,同時對值加+1,因此就會造成最後的結果可能不是5000,這種方式是執行緒不安全的。