1. 程式人生 > >併發程式設計與高併發解決方案學習(同步容器)

併發程式設計與高併發解決方案學習(同步容器)

ArrayList->Vector,Stack

HashMap->HashTable(key,value不能為null)

Collections.synchronizedXXX(List、Set、Map)


[java]  view plain  copy
  1. import com.mmall.concurrency.annoations.ThreadSafe;  
  2. import lombok.extern.slf4j.Slf4j;  
  3.   
  4. import java.util.List;  
  5. import java.util.Vector;  
  6. import java.util.concurrent.CountDownLatch;  
  7. import java.util.concurrent.ExecutorService;  
  8. import java.util.concurrent.Executors;  
  9. import
     java.util.concurrent.Semaphore;  
  10.   
  11. @Slf4j  
  12. @ThreadSafe  
  13. public class VectorExample1 {  
  14.     // 請求總數  
  15.     public static int clientTotal = 
    5000;  
  16.     // 同時併發執行的執行緒數  
  17.     public static int threadTotal = 200;  
  18.     private static List<Integer> list = new Vector<>();  
  19.     public static void main(String[] args) throws Exception {  
  20.         ExecutorService executorService = Executors.newCachedThreadPool();  
  21.         final Semaphore semaphore = new Semaphore(threadTotal);  
  22.         final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);  
  23.         for (int i = 0; i < clientTotal; i++) {  
  24.             final int count = i;  
  25.             executorService.execute(() -> {  
  26.                 try {  
  27.                     semaphore.acquire();  
  28.                     update(count);  
  29.                     semaphore.release();  
  30.                 } catch (Exception e) {  
  31.                     log.error("exception", e);  
  32.                 }  
  33.                 countDownLatch.countDown();  
  34.             });  
  35.         }  
  36.         countDownLatch.await();  
  37.         executorService.shutdown();  
  38.         log.info("size:{}", list.size());  
  39.     }  
  40.   
  41.     private static void update(int i) {  
  42.         list.add(i);  
  43.     }  
  44. }  

同步容器不一定是執行緒安全的,例如:

[java]  view plain  copy
  1. import com.mmall.concurrency.annoations.NotThreadSafe;  
  2.   
  3. import java.util.Vector;  
  4.   
  5. @NotThreadSafe  
  6. public class VectorExample2 {  
  7.     private static Vector<Integer> vector = new Vector<>();  
  8.     public static void main(String[] args) {  
  9.         while (true) {  
  10.             for (int i = 0; i < 10; i++) {  
  11.                 vector.add(i);  
  12.             }  
  13.             Thread thread1 = new Thread() {  
  14.                 public void run() {  
  15.                     for (int i = 0; i < vector.size(); i++) {  
  16.                         vector.remove(i);  
  17.                     }  
  18.                 }  
  19.             };  
  20.             Thread thread2 = new Thread() {  
  21.                 public void run() {  
  22.                     for (int i = 0; i < vector.size(); i++) {  
  23.                         vector.get(i);  
  24.                     }  
  25.                 }  
  26.             };  
  27.             thread1.start();  
  28.             thread2.start();  
  29.         }  
  30.     }  
  31. }  


[java]  view plain  copy
  1. import java.util.Iterator;  
  2. import java.util.Vector;  
  3.   
  4. public class VectorExample3 {  
  5.     // java.util.ConcurrentModificationException  
  6.     private static void test1(Vector<Integer> v1) { // foreach  
  7.         for(Integer i : v1) {  
  8.             if (i.equals(3)) {  
  9.                 v1.remove(i);  
  10.             }  
  11.         }  
  12.     }  
  13.   
  14.     // java.util.ConcurrentModificationException  
  15.     private static void test2(Vector<Integer> v1) { // iterator  
  16.         Iterator<Integer> iterator = v1.iterator();  
  17.         while (iterator.hasNext()) {  
  18.             Integer i = iterator.next();  
  19.             if (i.equals(3)) {  
  20.                 v1.remove(i);  
  21.             }  
  22.         }  
  23.     }  
  24.   
  25.     // success  
  26.     private static void test3(Vector<Integer> v1) { // for  
  27.         for (int i = 0; i < v1.size(); i++) {  
  28.             if (v1.get(i).equals(3)) {  
  29.                 v1.remove(i);  
  30.             }  
  31.         }  
  32.     }  
  33.   
  34.     public static void main(String[] args) {  
  35.         Vector<Integer> vector = new Vector<>();  
  36.         vector.add(1);  
  37.         vector.add(2);  
  38.         vector.add(3);  
  39.         test1(vector);  
  40.     }  
  41. }  

HashTable 執行緒安全

[java] 

相關推薦

併發程式設計併發解決方案學習(併發程式設計初體驗)

以下都是發生執行緒安全的案例: 模擬5000個請求,併發數200 package vip.fkandy.chapter02; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.CountDown

併發程式設計併發解決方案學習(Java 記憶體模型)

JMM(Java Memory Model)    JMM是一種規範,規範了Java虛擬機器與計算機記憶體是如何協同工作的,規定了一個執行緒如何和何時可以看到其他執行緒修改過的共享變數的值,以及在必須的時候如果同步的訪問共享變數。棧    棧的優勢:存取速度比堆要快,僅次於計

併發程式設計併發解決方案學習(同步容器)

ArrayList->Vector,Stack HashMap->HashTable(key,value不能為null) Collections.synchronizedXXX(List、Set、Map) [java]  view pl

併發程式設計併發解決方案學習(常見類執行緒安全性研究)

StringBuilder 非執行緒安全import com.mmall.concurrency.annoations.NotThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.

併發程式設計併發解決方案學習併發併發基本概念)

一、概念    併發:同時擁有兩個或兩個以上執行緒,如果程式在單核處理器上執行,多個執行緒將替換地換入或者換出記憶體,這些執行緒是同時"存在"的,每個執行緒都處於執行過程中的某個狀態,如果執行在多核處理

長文慎入-探索Java併發程式設計併發解決方案[轉]

轉自:https://yq.aliyun.com/articles/636038 所有示例程式碼,請見/下載於https://github.com/Wasabi1234/concurrency   高併發處理的思路及手段    

Java併發程式設計併發解決方案解析

本文轉載自:Java併發程式設計與高併發解決方案解析 現在在各大網際網路公司中,隨著日益增長的網際網路服務需求,高併發處理已經是一個非常常見的問題,在這篇文章裡面我們重點討論兩個方面的問題,一是併發程式設計,二是高併發解決方案。 文章中的程式碼實現詳見 專案 Git

2019最新Java併發程式設計併發解決教程

併發: 同時擁有兩個或者多個執行緒,如果程式在單核處理器上執行多個執行緒將交替地換入或者換出記憶體,這些執行緒是 同時“存在”的,每個執行緒都處於執行過程中的某個狀態,如果執行在多核處理器上,此時,程式中的每個執行緒都 將分配到一個處理器核上,因此可以同時執行。高併發( Hi

Java併發程式設計併發學習總結(一)-大綱

系列 開篇語 想寫這樣一個東西很久了,在慕課網上學完某老師的課程(避免打廣告的嫌疑就不貼出來了,感興趣的同學可以去慕課網上去搜來看看,是個付費課程)之後就覺得應該有這樣的一個學習總結的東西來,後來因為懶又有其他事情耽誤了,然後又上了新專案(正好拿來練手了,當然

併發程式設計併發場景:秒殺(無鎖、排他鎖、樂觀鎖、redis快取的逐步演變)

環境: jdk1.8;spring boot2.0.2;Maven3.3 摘要說明: 在實際開發過程中往往會出現許多高併發場場景,秒殺,強紅包,搶優惠卷等; 其中: 秒殺場景的特點就是單位時間湧入使用者量極大,商品數少,且要保證不可超量銷售; 秒殺產品的本質就是減

【2019春招準備:23. 併發程式設計併發總結】

【內容】 A.併發 執行緒安全 執行緒封閉 執行緒排程 同步容器 併發容器 AQS J.U.C

併發大資料解決方案概述

概述 隨著業務的不斷豐富,高併發和海量資料的處理日益成為影響系統性能的重要問題。下面將提供一些針對併發問題和海量資料處理的解決方案。 海量資料的解決方案: 快取 頁面靜態化 資料庫優化 分離活躍資料 批量讀取和延遲修改 讀寫分離 分散式資料

Web大規模併發請求和搶購的解決方案

電商的秒殺和搶購,對我們來說,都不是一個陌生的東西。然而,從技術的角度來說,這對於Web系統是一個巨大的考驗。當一個Web系統,在一秒鐘內收到數以萬計甚至更多請求時,系統的優化和穩定至關重要。這次我們會關注秒殺和搶購的技術實現和優化,同時,從技術層面揭開,為什麼我們總是不容易搶到火車票的原因

深入理解併發下分散式事務的解決方案

1、什麼是分散式事務 分散式事務就是指事務的參與者、支援事務的伺服器、資源伺服器以及事務管理器分別位於不同的分散式系統的不同節點之上。以上是百度百科的解釋,簡單的說,就是一次大的操作由不同的小操作組成,這些小的操作分佈在不同的伺服器上,且屬於不同的應用,分散式事務需要保證這

Java併發程式設計入門併發面試

第6章 J.U.C之AQS講解 AQS是J.U.C的重要元件,也是面試的重要考點。這一章裡將重點講解AQS模型設計及相關同步元件的原理和使用,都非常實用,具體包括:CountDownLatch、Semaphore、CyclicBarrier、ReentrantLock與鎖、Condition等。這些元

併發的詳解及解決方案

一、什麼是高併發 高併發(High Concurrency)是網際網路分散式系統架構設計中必須考慮的因素之一,它通常是指,通過設計保證系統能夠同時並行處理很多請求。   高併發相關常用的一些指標有響應時間(Response Time),吞吐量(Throughput),每秒查詢率QPS(Quer

使用Redis搶紅包併發出現connection refused的解決方案

最近使用redis佇列實現搶紅包,在使用jmeter測試時發現1000個執行緒0s併發搶紅包出現connect refused錯誤,但是500個10s就正常。原始碼如下 private static void initialPool() { try {

深入理解分散式事務,併發下分散式事務的解決方案

1、什麼是分散式事務 分散式事務就是指事務的參與者、支援事務的伺服器、資源伺服器以及事務管理器分別位於不同的分散式系統的不同節點之上。以上是百度百科的解釋,簡單的說,就是一次大的操作由不同的小操作組成,這些小的操作分佈在不同的伺服器上,且屬於不同的應用,分散式事務需要保證這

多執行緒併發程式設計之基礎知識(上)

前言 幾乎所有的程式設計師都知道,現代作業系統進行資源分配的最小單元是程序,而作業系統進行運算排程的最小單元是執行緒,其實,在Linux中執行緒也可以看作是一種輕量級的程序,那麼執行緒是包含於程序之中的,是程序中實際的運作單位;同一程序中的多個執行緒共用同一塊

PHP解決網站大資料大流量併發

1:硬體方面 普通的一個p4的伺服器每天最多能支援大約10萬左右的IP,如果訪問量超過10W那麼需要專用的伺服器才能解決,如果硬體不給力 軟體怎麼優化都是於事無補的。主要影響伺服器的速度 有:網路-硬碟讀寫速度-記憶體大小-cpu處理速度。 2:軟體方面 第一個要說的