1. 程式人生 > >多執行緒共享操作實列

多執行緒共享操作實列

專案需求

      最近在做一個和支付相關的專案,由於上游通道對每個商戶交易額度有上限風控。因此我們需要實現一個商戶輪詢的機制,通過使用多個商戶號,來提高交易上限,滿足交易需求。

需求分析

      通過需求分析,我們知道商戶的交易額度是共享資源,因此涉及到了共享資源同步的問題,需要我們控制商戶的交易額度,及時切換上送的交易商戶號,保證在多執行緒的情況下執行。

功能實現

不說那麼多了,直接貼程式碼。

根據業務需求,設計介面:

  1. publicinterface IncOrDecInterface {  
  2.     /** 
  3.      * 恢復額度 
  4.      * 當交易失敗時,恢復商戶可使用的交易額度。 
  5.      * @param amount
     
  6.      */
  7.     boolean inc(Long amount);  
  8.     /** 
  9.      * 減少額度 
  10.      * 交易時,根據交易金額減少商戶可使用額度。 
  11.      * @param amount 
  12.      */
  13.     boolean dec(Long amount);  
  14.     /** 
  15.      * 更新商戶可使用額度 
  16.      * 由於商戶額度每天更新一次,因此設計此介面,用於重置或更新商戶可使用額度。 
  17.      * @param amount 
  18.      */
  19.     boolean update(Long amount);  
  20.     /** 
  21.      * 判斷物件是否有鎖 
  22.      */
  23.     boolean isLook();  
  24. }  

商戶物件

  1. publicclass Merchant implements IncOrDecInterface{  
  2.     privatestaticfinal Logger log = LoggerFactory.getLogger(UnsPayMerchant.class);  
  3.     private String merchantNo;  
  4.     private String signKey;  
  5.     privatevolatilelong maxTransactionAmount;  
  6.     private Lock lock = new
     ReentrantLock();  
  7.     privateboolean isLook = false;  
  8.     public String getMerchantNo() {  
  9.         return merchantNo;  
  10.     }  
  11.     publicvoid setMerchantNo(String merchantNo) {  
  12.         this.merchantNo = merchantNo;  
  13.     }  
  14.     public String getSignKey() {  
  15.         return signKey;  
  16.     }  
  17.     publicvoid setSignKey(String signKey) {  
  18.         this.signKey = signKey;  
  19.     }  
  20.     publiclong getMaxTransactionAmount() {  
  21.         try {  
  22.             lock.lock();  
  23.             return maxTransactionAmount;  
  24.         }finally {  
  25.             lock.unlock();  
  26.         }  
  27.     }  
  28.     publicvoid setMaxTransactionAmount(long maxTransactionAmount) {  
  29.         this.maxTransactionAmount = maxTransactionAmount;  
  30.     }  
  31.     @Override
  32.     publicboolean inc(Long amount) {  
  33.         try{  
  34.             lock.lock();  
  35.             isLook = true;  
  36.             log.info("商戶號[{}] 當前額度[{}] 充值金額[{}]",this.merchantNo,this.maxTransactionAmount,amount);  
  37.             this.maxTransactionAmount =this.maxTransactionAmount + amount;  
  38.             Thread.sleep(1000);  
  39.             returntrue;  
  40.         } catch (InterruptedException e) {  
  41.             e.printStackTrace();  
  42.         } finally {  
  43.             lock.unlock();  
  44.             isLook = false;  
  45.         }  
  46.         returnfalse;  
  47.     }  
  48.     @Override
  49.     publicboolean dec(Long amount) {  
  50.         try{  
  51.             lock.lock();  
  52.             isLook = true;  
  53.             log.info("當前執行緒[{}] 商戶號[{}] 當前額度[{}] 消費金額[{}]",Thread.currentThread().getName(),this.merchantNo ,this.maxTransactionAmount, amount);  
  54.             if(this.maxTransactionAmount >= amount){  
  55.                 this.maxTransactionAmount = this.maxTransactionAmount - amount;  
  56.                 returntrue;  
  57.             }  
  58.         }  finally {  
  59.             lock.unlock();  
  60.             isLook = false;  
  61.         }  
  62.         returnfalse;  
  63.     }  
  64.     @Override
  65.     publicboolean update(Long amount) {  
  66.         try{  
  67.             lock.lock();  
  68.             isLook = true;  
  69.             log.info("商戶號[{}] 當前額度[{}] 恢復額度[{}]"this.merchantNo, this.maxTransactionAmount, amount);  
  70.             this.maxTransactionAmount = amount;  
  71.             returntrue;  
  72.         }finally {  
  73.             lock.unlock();  
  74.             isLook = false;  
  75.         }  
  76.     }  
  77.     @Override
  78.     publicboolean isLook() {  
  79.         return isLook;  
  80.     }  
  81. }  

商戶容器

  1. publicclass MerchantContainer {  
  2.     privatestaticfinal Logger log = LoggerFactory.getLogger(MerchantContainer.class);  
  3.     

    相關推薦

    執行共享操作

    專案需求      最近在做一個和支付相關的專案,由於上游通道對每個商戶交易額度有上限風控。因此我們需要實現一個商戶輪詢的機制,通過使用多個商戶號,來提高交易上限,滿足交易需求。需求分析      通過需求分析,我們知道商戶的交易額度是共享資源,因此涉及到了共享資源同步的問題

    java執行2:區域性變數的執行安全,變數的非執行安全

    java多執行緒2:區域性變數的執行緒安全,實列變數的非執行緒安全 “非執行緒安全“就是在多個執行緒訪問同一個物件的例項變數進行併發訪問時候發生,產生的後果就是”髒讀“,也就是取到的資料其實是被修改過的。 a.多執行緒訪問區域性變數是執行緒安全的。 package multiThread

    面試題 執行 順序操作

    問題 編寫一個程式,程式會啟動4個執行緒,向4個檔案A,B,C,D裡寫入資料,每個執行緒只能寫一個值。 執行緒A:只寫1 執行緒B:只寫2 執行緒C:只寫3 執行緒D:只寫4 4個檔案A,B,C,D。 程式執行起來,4個檔案的寫入結果如下:

    執行常用操作方法(sleep、yield、join)

    執行緒的命名與取得 執行緒的命名: 通過構造方法在建立執行緒時設定執行緒名稱 直接繼承Thread類: public Thread (String name); Runable或者Callable介面實現多執行緒: public Thread (Run

    Android開發之執行操作方式Thread,TimerTask,AsyncTask

    雨鬆MOMO原創文章如轉載,請註明:轉載至我的獨立域名部落格雨鬆MOMO程式研究院,原文地址:http://www.xuanyusong.com/archives/344 Android研究院之遊戲開發多執行緒(十六)   遊戲開發與軟體開發多執行緒的重要性  &

    python-執行-共享變數問題

    import threading sum = 0 loopSum = 1000000 lock = threading.Lock() def Add(): global sum, loopSum for i in range(1,loopSum): loc

    OpenMP: 執行檔案操作

    OpenMP:多執行緒檔案操作 簡介 具體實現 1. OpenMP常用函式 2. 並行區域 3. for 迴圈並行化基本用法 3.1 資料不相關性 3.2 for迴圈並行化的幾

    執行非同步操作日誌

    上次寫的一篇部落格,多執行緒非同步操作日誌不完整,現在寫一個完整的 功能是:使用者訪問一個controller,將訪問的記錄儲存到佇列中去,在開啟定時器,消費掉記錄儲存到檔案中(可改為儲存到資料庫) 我的idea目錄: controller中的程式碼: package com.

    執行共享資源

    多執行緒共享資源 按照作業系統原理,程序是系統資源分配的最小單位,執行緒是cpu排程的最小單位。執行緒共享程序申請的資源,但是執行緒有維持自己正常執行的很小的資源,這很小的資源為各個執行緒獨有。 同一個程序中建立的多執行緒共享的環境包括: 程序程式碼段 程序的公有資

    執行-共享全域性變數

    from threading import Thread import time g_num = 100 def work1(): global g_num for i in range(3): g_num += 1 print("----in wo

    C語言執行目錄操作

    #include <stdio.h>#include <pthread.h>#include <stdlib.h>#include <sys/types.h>#include <dirent.h> #define NUM 2 void threa

    為什麼EventLoop能避免執行併發操作和鎖競爭

    Netty的Reactor執行緒池就是EventLoopGroup,是一個EventLoop的陣列。EventLoop是用來處理所有註冊到自身這個執行緒的Selector上的channel,Selector的輪詢操作由EventLoop的run方法驅動,在一個迴圈體內迴圈執行,包括使用者自定

    Java執行11:執行同步操作

    什麼情況下需要同步 1、當多執行緒併發,有多段程式碼同時執行時,有時希望某一段程式碼執行的過程中CPU不要切換到其他執行緒工作。這時就需要執行緒同步。 2、如果兩段程式碼是同步的,那麼同一段時間只能執行

    水滴石穿--執行原子操作、threadlocal、volatile、執行下的單例模式

    接著上一篇文章,下面看看幾個比較好理解的知識點!! volatile java關鍵字volatile修飾的變數從字面意義上理解易變的,不穩定的,事實上時告訴編譯器該變數是易變的不要對該變數使用快取等級的優化,每次都從記憶體地址中讀取值。 不過並沒有說明在對volatile修飾的變數進行修

    python執行-共享全域性變數

    目錄 多執行緒-共享全域性變數 多執行緒-共享全域性變數 列表當作實參傳遞到執行緒中 總結 多執行緒-共享全域性變數問題 多執行緒開發可能遇到的問題 測試1 測試2 多執行緒-共享全域性變數 多執行緒-共享全域性變

    JAVA執行——共享變數

    【轉載】Java多執行緒程式設計:變數共享分析(Thread) 原部落格網址:https://www.cnblogs.com/xudong-bupt/archive/2013/05/22/3087864.html

    執行基礎操作

    本片部落格會貼上部分程式碼,想要了解更多程式碼資訊,可訪問小編的GitHub關於本篇的程式碼 - 對比程序與執行緒的區別 執行緒概念及特點 Linux下執行緒是以程序模擬的,Linux下的程序控制塊pcb實際就是一個執行緒,其他系統不一定 Linux

    兩種方式實現執行共享資源(典型的售票例子)

    1、繼承Thread TestThread類 public class TestThread extends Thread{ private int ticket = 300; @Override public void run() { while(true){

    程序和執行程式設計操作

    1.什麼是程序 程序是系統最小的資源管理單元,是一個程式在一個數據集上的一次動態執行過程。 2.什麼是執行緒 執行緒是計算機程式執行的實際執行者,是cpu的執行單元,在計算機中,程序主要是為了執行緒的執行進行分配資源操作,程式真正的執行者是執行緒,每一個程序至少有一個執

    Hbase批量匯入資料,支援執行同時操作

    /** * HBase操作工具類:快取模式多執行緒批量提交作業到hbase * * @Auther: ning.zhang * @Email: [email protected] * @CreateDate: 2018/7/30 */ public c