1. 程式人生 > >Java 高併發下的實踐

Java 高併發下的實踐

一、使用的技術

HashMap

ConcurrentHashMap

Lock

ReadWriteLock

synchronized

二、一百萬併發下的組合

ConcurrentLockMap

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package cn.edu.scau.mk.map;

import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * * @author MK */ public class ConcurrentLockMap implements In { ConcurrentHashMap<Integer, Integer> map = new ConcurrentHashMap<>(); Lock lock
= new ReentrantLock(); @Override public void add(int a) { lock.lock(); try { if (map.containsKey(a)) { map.put(a, 1 + map.get(a)); } else { map.put(a, 1); } } finally { lock.unlock(); } } @Override
public int get(int a) { int as = map.get(a); return as; } }
View Code

ConcurrentSynchronizedMap

package cn.edu.scau.mk.map;

import java.util.concurrent.ConcurrentHashMap;

/**
 *
 * @author MK
 */
public class ConcurrentSynchronizedMap implements In {

    ConcurrentHashMap<Integer, Integer> map = new ConcurrentHashMap<>();

    @Override
    public void add(int a) {
        synchronized ((""+a).intern()) {
            if (map.containsKey(a)) {

                map.put(a, 1 + map.get(a));

            } else {
                map.put(a, 1);
            }
        }
    }

    @Override
    public int get(int a) {
        int as = map.get(a);
        return as;
    }

}
View Code

LockHashMap

package cn.edu.scau.mk.map;

import java.util.HashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 *
 * @author MK
 */
public class LockHashMap implements In {

    HashMap<Integer, Integer> map = new HashMap<>();
    Lock lock = new ReentrantLock();

    @Override
    public void add(int a) {
        lock.lock();
        try {
            if (map.containsKey(a)) {
                map.put(a, 1 + map.get(a));
            } else {
                map.put(a, 1);
            }
        } finally {
            lock.unlock();
        }
    }

    @Override
    public int get(int a) {
         int as = 0;
        lock.lock();
        try {
            map.get(a);
        } finally {
            lock.unlock();
        }
        return as;
    }

}
View Code

ReadWriteHashMap

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package cn.edu.scau.mk.map;

import java.util.HashMap;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 *
 * @author MK
 */
public class ReadWriteHashMap implements In {

    HashMap<Integer, Integer> map = new HashMap<>();
    ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    //390

    @Override
    public void add(int a) {
        lock.writeLock().lock();
        try {
            if (map.containsKey(a)) {
                map.put(a, 1 + map.get(a));
            } else {
                map.put(a, 1);
            }
        } finally {
            lock.writeLock().unlock();
        }
    }

    @Override
    public int get(int a) {
        int as = 0;
        lock.readLock().lock();
        try {
            as = map.get(a);
        } finally {
            lock.readLock().unlock();
        }
        return as;
    }

}
View Code

SynchronizedHashMap

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package cn.edu.scau.mk.map;

import java.util.HashMap;

/**
 *
 * @author MK
 */
public class SynchronizedHashMap implements In {

    HashMap<Integer, Integer> map = new HashMap<>();
  

    @Override
    public synchronized void add(int a) {
       
            if (map.containsKey(a)) {
                map.put(a, 1 + map.get(a));
            } else {
                map.put(a, 1);
            }
        
    }

    @Override
    public synchronized int get(int a) {
        int as = map.get(a);
       
        return as;
    }

}
View Code

In

package cn.edu.scau.mk.map;

/**
 *
 * @author MK
 */
public interface In {

    void add(int a);

    int get(int a);
    
}
View Code

Adder

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package cn.edu.scau.mk.map;

import java.util.Random;

/**
 *
 * @author MK
 */
public class Adder implements Runnable {

    In in;
    Random random = new Random();

    public Adder(In in) {
        this.in=in;
    }

    @Override
    public void run() {

        for (int i = 0; i < 1000; i++) {
            //in.add(random.nextInt());
            in.add(i);
            
        }

    }
}
View Code

Getter

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package cn.edu.scau.mk.map;

import java.util.Random;

/**
 *
 * @author MK
 */
public class Getter implements Runnable {

    In in;
    Random random = new Random();

    public Getter(In in) {
        this.in=in;
    }

    @Override
    public void run() {

        for (int i = 0; i < 1000; i++) {
            //in.add(random.nextInt());
            in.get(i);
            
        }

    }
}
View Code

TestDemo

package cn.edu.scau.mk.map;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 *
 * @author MK
 */
public class TestDemo {

    public static void main(String[] args) {
        In in = null;

        in = new ReadWriteHashMap();
        operate(in);
        in = new ConcurrentSynchronizedMap();
        operate(in);
        in = new ConcurrentLockMap();
        operate(in);
        in = new SynchronizedHashMap();
        operate(in);
        in = new LockHashMap();
        operate(in);
    }

    public static void operate(In in) {
        int poolSize = 1000000;
        Adder add = new Adder(in);
        ThreadPoolExecutor threadPool = (ThreadPoolExecutor) Executors.newCachedThreadPool();
        long start = System.currentTimeMillis();
        for (int i = 0; i < poolSize; i++) {
            threadPool.execute(add);
        }
        System.out.println(threadPool.getActiveCount());
        threadPool.shutdown();
        try {//等待直到所有任務完成
            threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.MINUTES);
            long end = System.currentTimeMillis() - start;
            System.out.print(in.getClass().getSimpleName()+" add:" + end);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        Getter get = new Getter(in);
        threadPool = (ThreadPoolExecutor) Executors.newCachedThreadPool();
        start = System.currentTimeMillis();
        for (int i = 0; i < poolSize; i++) {
            threadPool.execute(add);
        }
        threadPool.shutdown();
        try {//等待直到所有任務完成
            threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.MINUTES);
            long end = System.currentTimeMillis() - start;
            System.out.println(" get:" + end);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
View Code

三、輸出結果

(1)一萬併發

6642
ReadWriteHashMap add:1263 get:983
7
ConcurrentSynchronizedMap add:577 get:546
7373
ConcurrentLockMap add:1515 get:1731
7783
SynchronizedHashMap add:1810 get:1607
6632
LockHashMap add:1092 get:1029

(2)十萬併發

58095
ReadWriteHashMap add:149181 get:69606
1443
ConcurrentSynchronizedMap add:5678 get:6631
54623
ConcurrentLockMap add:84595 get:77182
48390
SynchronizedHashMap add:63958 get:64696
49078
LockHashMap add:64606 get:64364

(3)百萬併發

681252
ReadWriteHashMap add:215943 get:85792
25145
ConcurrentSynchronizedMap add:80593 get:76485
546230
ConcurrentLockMap add:912461 get:821907
636318
SynchronizedHashMap add:845893 get:850142
500129
LockHashMap add:792271 get:808326

相關推薦

Java 併發實踐

一、使用的技術 HashMap ConcurrentHashMap Lock ReadWriteLock synchronized 二、一百萬併發下的組合 ConcurrentLockMap /* * To change this license header, cho

java併發實用場景解決思路

2018年11月12日 10:07:16 阿智CMZ 閱讀數:5 標籤: 高併發

synchronized(java併發的唯一性驗證)

一般會遇到唯一性的問題,比如新增使用者要求使用者名稱稱或登陸名唯一,我們通常的做法是:先根據條件去資料中查詢是否存在,如果存在則提示已經存在了,不允許新增,否則插入。 但是這種做法在兩種情況下很容易出現問題: 1. 當新增使用者這個過程耗時比較長時,如果兩個人同時添加了一

Java架構-每秒上千訂單場景的分散式鎖併發優化實踐

“上一篇文章我們聊了聊Redisson這個開源框架對Redis分散式鎖的實現原理,如果有不瞭解的兄弟可以看一下:《拜託,面試請不要再問我Redis分散式鎖實現原理》。 今天就給大家聊一個有意思的話題:每秒上千訂單場景下,如何對分散式鎖的併發能力進行優化? 背景引入 首先,我們

java web系統在併發如何實現訂單號生成唯一?

java web系統在高併發下如何實現訂單號生成唯一? 系統訂單號規則:XXXX(固定字元)+年(後兩位)月日+流水號。流水號每天重新從1開始。 系統訂單號產生唯一的方案有哪幾種?由於訂單號規則已經確定,無法使用時間戳及隨機數,有哪些方案可以使用? 注:資料庫mysql,訂單號不是訂單表的主鍵

每秒上千訂單場景的分散式鎖併發優化實踐!【石杉的架構筆記】

歡迎關注個人公眾號:石杉的架構筆記(ID:shishan100) 週一至週五早8點半!精品技術文章準時送上! “上一篇文章我們聊了聊Redisson這個開源框架對Redis分散式鎖的實現原理,如果有不瞭解的兄弟可以看一下: 拜託,面試請不要再問我Redis分散式鎖的實現原理。 今天就給大家聊一個有

每秒上千訂單場景的分散式鎖併發優化實踐

“上一篇文章我們聊了聊Redisson這個開源框架對Redis分散式鎖的實現原理,如果有不瞭解的兄弟可以看一下:拜託,面試請不要再問我Redis分散式鎖的實現原理。 今天就給大家聊一個有意思的話題:每秒上千訂單場景下,如何對分散式鎖的併發能力進行優化? 背景引入 首先,我們一起來看看這個問題的背景?

每秒上千訂單場景的分散式鎖併發優化實踐

今天就給大家聊一個有意思的話題:每秒上千訂單場景下,如何對分散式鎖的併發能力進行優化?   背景引入   首先,我們一起來看看這個問題的背景?   前段時間有個朋友在外面面試,然後有一天找我聊說:有一個國內不錯的電商公司,面試官給他出了一個場景題:  

併發Java資料結構(List,Set,Map,Queue)

由於並行程式與序列程式的不同特點,適用於序列程式的一些資料結構可能無法直接在併發環境下正常工作,這是因為這些資料結構不是執行緒安全的。本節將著重介紹一些可以用於多執行緒環境的資料結構,如併發List、併發Set、併發Map等。 1.併發List Vector 或者 CopyOnWriteArrayList 是

併發java專案遇到的各種坑--概述篇(一)

      最近在做一個跨境電商的專案,主要是做跨境電商的企業做清關服務,將跨境電商企業訂單資訊生成清關報文推動海關,推送物流公司並獲取物流資訊,將海關回執和物流資訊分別推送給電商企業和倉庫系統等功能。此文章是為了記錄在整個技術選型,伺服器搭建部署中遇到的各種問題。     

Java 併發併發的ArrayList&&HashMap

     在平常的java程式碼開發過程中,我們會經常性的就會用到ArrayList和HashMap來輔助自己完成需求工作,而且配合的也是相當的默契。但是如果環境發生改變,在併發情況下,他是否還能

併發的訂單與庫存的處理

問題:一件商品只有100個庫存,現在有1000或者更多的使用者來購買,每個使用者計劃同時購買1個到幾個不等商品。如何保證庫存在高併發的場景下是安全的。 1.不多發 2.不少發 下單涉及的一些步驟 1.下單 2.下單同時預佔庫存 3.支付 4.支付成功真正減扣庫存 5.取消訂

實戰Java併發程式設計.epub

    【下載地址】 在過去單核CPU時代,單任務在一個時間點只能執行單一程式,隨著多核CPU的發展,並行程式開發就顯得尤為重要。 《實戰Java高併發程式設計》主要介紹基於Java的並行程式設計基礎、思路、方法和實戰。第一,立足於併發程式基礎,詳細介紹Ja

Java 併發專案筆記

maven 配置與安裝 下載maven 檔案 解壓之後,將檔案移動到\Applications資料夾內 使用cd ~ 進入根目錄資料夾 用ls -a列出資料夾內的所有檔案,找到一個名稱為.bash_profile的檔案,開啟該檔案來配置環境變數 export JAVA_HOME=/Library/Jav

SpringBoot實現Java併發秒殺系統之併發優化

秒殺系統架構的設計和優化分析,以我一個小菜雞,目前是說不出來的o(╥﹏╥)o。 因此呢,我這裡僅從本專案已經實現的優化來介紹一下: 本專案中做到了以下優化: 秒殺介面採用md5加密方式防刷。 訂單表使用聯合主鍵方式,限制一個使用者只能購買該商品一次。 配合Spring事務

2018最新實戰Java併發程式設計

在過去單核CPU時代,單任務在一個時間點只能執行單一程式,隨著多核CPU的發展,並行程式開發就顯得尤為重要。《實戰Java高併發程式設計》主要介紹基於Java的並行程式設計基礎、思路、方法和實戰。第一,立足於併發程式基礎,詳細介紹Java中進行並行程式設計的基本方法。第二,進一步詳細介紹JDK中對並

高階java併發,高效能,分散式,可用,負載均衡,系統架構實戰

Java併發程式設計(一): 併發程式設計的挑戰本文主要內容出自《Java併發程式設計的藝術》一書,是對該書內容的歸納和理解,有興趣的朋友請購買正版閱讀全部內容。 併發程式設計的目的是為了讓程式執行的更快,但是並不是啟動更多的執行緒,就能讓程式最大限度的併發執行。在進行併發程式設計時,如果希望通過多執行

HttpClient併發效能優化-http連線池

首先,明確兩點: 1.http連線池不是萬能的,過多的長連線會佔用伺服器資源,導致其他服務受阻 2.http連線池只適用於請求是經常訪問同一主機(或同一個介面)的情況下 3.併發數不高的情況下資源利用率低下 那麼,當你的業務符合上面3點,那麼你可以考慮使用http連線池來提高伺服器效能

spring cache redis 併發返回null

在使用springdata操作快取中,當訪問量比較大時,有可能返回null導致資料不準確,發生機率在0.01%或以下,雖然已經低於壓測標準,但是還是會影響部分使用者,經過一番篩查,發現原因如下: RedisCache 類中 有get方法,存在明顯的邏輯錯誤 “先判斷是否存在,再去get”,程

JAVA併發多執行緒必須懂的50個問題

ImportNew  首頁所有文章資訊Web架構基礎技術書籍教程Java小組工具資源  Java執行緒面試題 Top 50  2014/08/21 | 分類: 基礎技術 | 27 條評論 | 標籤: 多執行緒, 面試題  分享到: 692  本文由