1. 程式人生 > >淺談Java併發程式設計系列(一)—— 如何保證執行緒安全

淺談Java併發程式設計系列(一)—— 如何保證執行緒安全

執行緒安全類

保證類執行緒安全的措施:

  1. 不共享執行緒間的變數;
  2. 設定屬性變數為不可變變數;
  3. 每個共享的可變變數都使用一個確定的鎖保護;

保證執行緒安全的思路:

  1. 通過架構設計
    通過上層的架構設計和業務分析來避免併發場景。比如需要用多執行緒或分散式叢集統計一堆使用者的相關統計值,由於使用者的統計值是共享資料,因此需要保證執行緒安全。從業務上分析出使用者之間的資料並不共享,因此可以設計一個規則來保證一個使用者的計算工作和資料訪問只被一個執行緒或一臺機器完成,這樣從設計上避免了接下來可能的併發問題。

  2. 保證類無狀態
    有狀態會限制橫向擴充套件能力,也可能產生併發問題。如果類是無狀態的,那它永遠是執行緒安全的。因此在設計階段儘可能用無狀態的類來滿足業務需求。

  3. 區別原子操作和複合操作
    常見的複合操作包括check-then-act, i++等。
    雖然check-then-act從表面上看很簡單,但卻普遍存在與我們日常的開發中,特別是在資料庫存取這一塊。比如我們需要在資料庫裡存一個客戶的統計值,當統計值不存在時初始化,當存在時就去更新。如果不把這組邏輯設計為原子性的就很有可能產生出兩條這個客戶的統計值。
    在單機環境下處理這個問題還算容易,通過鎖或者同步來把這組複合操作變為原子操作,但在分散式環境下就不適用了。一般情況下是通過在資料庫端做文章,比如通過唯一性索引或者悲觀鎖來保障其資料一致性。當然任何方案都是有代價的,這就需要具體情況下來權衡。


  4. 使用鎖應注意:

    • 每個共享變數必須由一個確定的鎖保護。
    • 使用鎖會有效能損失
    • 鎖不能解決在分散式環境共享變數的併發問題。

相關推薦

Java併發程式設計系列—— 如何保證執行安全

執行緒安全類 保證類執行緒安全的措施: 不共享執行緒間的變數; 設定屬性變數為不可變變數; 每個共享的可變變數都使用一個確定的鎖保護; 保證執行緒安全的思路: 通過架構設計 通過

Java併發程式設計系列避免死鎖

避免死鎖 (1)避免一個執行緒同時獲取多個鎖 (2)避免一個執行緒在鎖內佔用多個資源,儘量保證每個鎖只佔用一個資源 (3)使用定時鎖,使用lock.trylock(timeout)替代內部鎖機制 (4)

Java的高併發程式設計系列synchronized鎖

private int count = 10; public void test(){ synchronized (this) { //任何執行緒要執行下面的程式碼,必須先拿到Demo02物件例項的鎖 count --;

Java併發程式設計學習——標準Thread

1、雖然System.out.println內部是加了鎖的,但是如果System.out.println(i- -),依然是執行緒不安全的,因為有的JVM,i- -需要三步才能完成。 2、通過interrupt方法停止執行緒 public class Int

Java併發程式設計規則:原子變數實現執行安全

判定規則: 如果一個類中存在變數,並且此變數的操作不是原子操作,那麼這個類就是非執行緒安全的類。線上程產生競爭條件的情況下,多執行緒訪問導致原子性不可保證。 競爭條件產生的原因: 當計算的正確性依賴於執行時中相關的時序或多執行緒的交替時,會產生競爭條件。多執行緒情況下,執行

Java的高併發程式設計系列

鎖定某物件o,如果o的屬性發生改變,不影響鎖的使用,但是如果o變成另外一個物件,則鎖定的物件發生改變,應該避免將鎖定物件的引用變成另外一個物件。 public class Demo17 {

併發程式設計執行基礎、執行之間的共享與協作

一、基礎概念 1.1 CPU核心數、執行緒數 **兩者的關係:**cpu的核心數與執行緒數是1:1的關係,例如一個8核的cpu,支援8個執行緒同時執行。但在intel引入超執行緒技術以後,cpu與執行緒數的關係就變成了1:2。此外在開發過程中並沒感覺到執行緒的限制,那是因為cpu

死磕java concurrent包系列從樂觀鎖、悲觀鎖到AtomicInteger的CAS演算法

前言 Java中有各式各樣的鎖,主流的鎖和概念如下: 這篇文章主要是為了讓大家通過樂觀鎖和悲觀鎖出發,理解CAS演算法,因為CAS是整個Concurrent包的基礎。 樂觀鎖和悲觀鎖 首先,java和資料庫中都有這種概念,他是一種從執行緒同步的角度上看的一種廣義上的概念: 悲觀鎖:悲觀的認為自己在使用資料的

響應式程式設計系列:什麼是響應式程式設計?reactor入門

響應式程式設計 系列文章目錄 (一)什麼是響應式程式設計?reactor入門 (二)Flux入門學習:流的概念,特性和基本操作 (三)Flux深入學習:流的高階特性和進階用法 (四)reactor-core響應式api如何測試和除錯? (五)Spring reactive: Spring WebFl

Java併發——鎖框架

來源:《Java執行緒與併發程式設計實踐》以及          https://blog.csdn.net/qq_38293564/article/details/80476659 1. 鎖框架 java.util.co

Java併發——Executor框架

對看過的資料進行了整理,方便自己學習 來源:https://www.cnblogs.com/love-Stefanie/p/6728228.html            https://www.cnblogs.com/

Java執行程式設計核心技術》執行技能

最近閱讀了一本《Java多執行緒程式設計核心技術》,總結了一下每章的知識點: 第一章,java多執行緒技能 知識點: 1,實現多執行緒程式設計的方式主要有兩種:一是繼承Thread類,重新r

併發程式設計執行基礎

目錄 併發程式設計(一)多執行緒基礎 1、程序和執行緒的概念 2、為什麼要使用多執行緒 3、多執行緒使用的場景 4、多執行緒建立方式 4.1、繼承Thread類 4.2、實現Runable介面 4.3、匿名內部類 4.4、執行緒池(後面細說)

Java遠端呼叫系列——概覽篇

首先,來幾個基本問題 遠端呼叫是什麼(概念)? 內涵 定義: 本質上來講, 通俗來講, 外延(相關的易混概念) Java中的遠端 VS 客戶端和服務端的互動呼叫 遠端通訊 VS 遠端呼叫 VS 服務和服務的呼叫 遠端呼叫 VS 遠端過程呼叫 VS 遠端物件呼叫

C++11 併發程式設計基礎併發、並行與C++多執行

正文 C++11標準在標準庫中為多執行緒提供了元件,這意味著使用C++編寫與平臺無關的多執行緒程式成為可能,而C++程式的可移植性也得到了有力的保證。另外,併發程式設計可提高應用的效能,這對對效能錙銖必較的C++程式設計師來說是值得關注的。 回到頂部 1. 何為併發 併發指的是兩個或多個獨立的活動在同

Android 事件分發機制

get touch 需要 傳遞 cimage android ges 常見 滑動 在上一篇文章中,淺談Android 事件分發機制(一),簡要分析了一下事件分發機制的原理,總結一下就是事件層層傳遞,直到被消費,原理看似簡單,但是在實際使用過程中,場景各不相同,復雜程度也就因

Java 併發隨身記之 Unsafe類

  最近在看Java併發相關的內容,需要自己整理整理,不然就生疏了。工作2年多,工作時一般注都是框架、訊息這些內容,對基礎內容比較忽視。閒話不說,既然是併發內容,首先先複習一下Unsafe的內容吧。 Unsafe 類提供了硬體級別的原子操作,它提供非常有趣的一些內容。首先我們看下Unsafe檔案。並對其一些內

java網路程式設計學習

一 網路的分層 網路有兩個分層方案,一種是傳統的5層結構,另一種是ISO的7層結構 1 5層網路 (1)物理層 (2)資料鏈路層(PPP,Wifi,Ethernet) (3)網路層(IP,ARP) (4)傳輸層(TCP,UDP,ICMP) (5)應用層(HTTP,FTP,S

深入理解java虛擬機器系列java記憶體區域與記憶體溢位異常

文章主要是閱讀《深入理解java虛擬機器:JVM高階特性與最佳實踐》第二章:Java記憶體區域與記憶體溢位異常 的一些筆記以及概括。 好了開始。如果有什麼錯誤或者遺漏,歡迎指出。 一、概述 先上一張圖 這張圖主要列出了Java虛擬機器管理的記憶體的幾個區域。 常有人

Java介面程式設計實戰——簡易QQ登入介面

目標圖:介面分析:從上部和下部可以看出框架應該是用邊界佈局。邊界上部新增一個標籤附圖,下部新增一個JPanel面板構成流式佈局帶一個按鈕和一個標籤連結。在中間部分中,新增一個面板,新增選項卡窗格、文字框、密碼框、多選框、標籤等元件。程式碼實現:import java.awt.