並發三大特性:原子性、可見性、有序性

一、原子性

原子性是指一個操作是不可中斷的整體,要麼全部執行成功,要麼全部執行失敗。在多線程環境下,原子性是保證數據正確的基礎。

Java提供了synchronized關鍵字和java.util.concurrent.atomic包下的原子類來實現原子操作。

public class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public int getCount() {
        return count;
    }
}

在上面的代碼中,通過synchronized關鍵字使increment方法變成原子操作,從而保證了count的正確性。

除此之外,還可以使用AtomicInteger這個原子類來實現計數器:

public class Counter {
    private AtomicInteger count = new AtomicInteger();

    public void increment() {
        count.incrementAndGet();
    }

    public int getCount() {
        return count.get();
    }
}

二、可見性

可見性是指當一個線程修改了共享變數時,另一個線程能夠立即看到這個修改。在多線程環境下,可見性是保證數據一致性的基礎。

Java提供了volatile關鍵字來實現可見性,它能夠保證在讀取和修改變數時,都是直接從內存中讀取和寫入,而不是從緩存中讀取和寫入。

public class Counter {
    private volatile int count = 0;

    public void increment() {
        count++;
    }

    public int getCount() {
        return count;
    }
}

三、有序性

有序性是指程序執行的順序與代碼的先後順序一致,Java中的指令重排可能會導致代碼執行的順序不一致,從而產生一系列問題。

Java提供了synchronized和volatile兩種方式來保證有序性。

在下面的例子中,線程A和線程B執行的結果可能會不同:

public class OrderExample {
    private int x = 0;
    private boolean flag = false;

    public void write() {
        x = 1;
        flag = true;
    }

    public void read() {
        if (flag) {
            int y = x + 1;
        }
    }
}

在上面的代碼中,如果線程A先執行write方法,然後線程B執行read方法,在沒有任何同步措施的情況下,y可能為0而不是2。

使用volatile關鍵字可以避免指令重排:

public class OrderExample {
    private volatile int x = 0;
    private volatile boolean flag = false;

    public void write() {
        x = 1;
        flag = true;
    }

    public void read() {
        if (flag) {
            int y = x + 1;
        }
    }
}

結語

並發編程是一個複雜的問題,掌握並發三大特性對於正確使用多線程至關重要。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/231918.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-11 01:08
下一篇 2024-12-11 01:08

相關推薦

  • Python計算機語言的特性與應用

    Python,是一種高層次、解釋型的、面向對象的計算機編程語言。 一、簡介 Python編程語言的初衷是:代碼簡潔易讀、可拓展性強、適用範圍廣。其應用領域包括Web開發、數據科學、…

    編程 2025-04-29
  • Python三大:NumPy、Pandas、matplotlib

    本文將詳細介紹三大Python數據處理及可視化庫——NumPy、Pandas以及matplotlib,為讀者提供從基礎使用到應用場景的全面掌握。 一、NumPy NumPy是Pyt…

    編程 2025-04-27
  • Python列表的特性

    Python列表是一種能夠保存任意對象的動態數組結構。Python列表具有以下特性: 一、可變性 Python列表是可變的,可以動態改變其元素。可以通過索引來訪問和修改列表中的元素…

    編程 2025-04-27
  • Java8特性詳解

    Java8是Java語言的一個重要版本。有很多新的特性被加入,比如Lambda表達式、方法引用、Stream API等。這些特性提供了更為一致、緊湊的代碼風格和更好的可讀性,使得J…

    編程 2025-04-25
  • Java 14:新的特性和改進

    一、Records Java 14中引入了Records,這是一種新的類聲明,用於聲明輕量、不可變值類。Records類似於傳統Java類,但通過簡化聲明,目的是更容易地定義數據聚…

    編程 2025-04-25
  • Java 8特性詳解

    一、Lambda表達式 1、Lambda表達式是Java 8中最大的特性之一,它提供了一種簡潔的方式來寫匿名內部類。Java 8中,Lambda表達式的格式為(parameters…

    編程 2025-04-23
  • 面向對象的三大特性

    一、封裝性 封裝是面向對象的核心思想之一,指將數據與對其進行操作的方法(或稱為函數)封裝在一起,成為一個「類」(Class)。通過封裝,可以達到隱藏數據、保護數據、使代碼易於理解和…

    編程 2025-04-13
  • 全面解析lskypro的開發特性

    一、簡介 lskypro是一款集成了多種現代化技術的軟體平台,擁有全面的功能和靈活的開發特性。它可以幫助開發者更高效地開發應用程序,縮短開發周期,提高開發質量。下面將從多個方面介紹…

    編程 2025-04-13
  • 淺談Stylex插件的使用與特性

    一、簡介 Stylex是一個VS Code擴展,它可以幫助你在CSS樣式表中輕鬆地編寫和維護變數(例如顏色、字體、間距等)。 與其他CSS預處理器不同,Stylex不需要任何外部編…

    編程 2025-04-12
  • InnoDB引擎的四大特性

    InnoDB引擎是MySQL資料庫中比較流行的一個存儲引擎,它具有四大特性:ACID事務、行級鎖、MVCC多版本並發控制、可靠性架構。本文將從多個方面對這四大特性進行詳細闡述。 一…

    編程 2025-02-24

發表回復

登錄後才能評論