原子變量
java.util.concurrent.atomic包定義了支持單個變量的原子操作的類,所有類都有get和set方法,類似于對volatile變量的讀寫操作,也就是說,set與在同一個變量上任何后續(xù)的get具有先發(fā)生關(guān)系,compareAndSet原子方法也具有這些內(nèi)存一致性特性,適用于整數(shù)原子變量的簡單原子算法也是如此。
要查看如何使用此包,讓我們返回我們最初用于演示線程干擾的Counter類:
class Counter { private int c = 0; public void increment() { c++; } public void decrement() { c--; } public int value() { return c; } }
使Counter免受線程干擾的一種方法是使其方法同步,如在SynchronizedCounter中:
class SynchronizedCounter { private int c = 0; public synchronized void increment() { c++; } public synchronized void decrement() { c--; } public synchronized int value() { return c; } }
對于這個簡單的類,同步是可接受的解決方案,但是對于更復雜的類,我們可能希望避免不必要的同步對活性的影響,用AtomicInteger替換int字段允許我們在不使用同步的情況下防止線程干擾,如在AtomicCounter中:
import java.util.concurrent.atomic.AtomicInteger; class AtomicCounter { private AtomicInteger c = new AtomicInteger(0); public void increment() { c.incrementAndGet(); } public void decrement() { c.decrementAndGet(); } public int value() { return c.get(); } }上一篇:執(zhí)行器 下一篇:配置實用程序
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/73060.html
摘要:并發(fā)教程原子變量和原文譯者飛龍協(xié)議歡迎閱讀我的多線程編程系列教程的第三部分。如果你能夠在多線程中同時且安全地執(zhí)行某個操作,而不需要關(guān)鍵字或上一章中的鎖,那么這個操作就是原子的。當多線程的更新比讀取更頻繁時,這個類通常比原子數(shù)值類性能更好。 Java 8 并發(fā)教程:原子變量和 ConcurrentMap 原文:Java 8 Concurrency Tutorial: Synchroni...
同步 線程主要通過共享對字段和引用對象的引用字段的訪問來進行通信,這種通信形式非常有效,但可能產(chǎn)生兩種錯誤:線程干擾和內(nèi)存一致性錯誤,防止這些錯誤所需的工具是同步。 但是,同步可能會引入線程競爭,當兩個或多個線程同時嘗試訪問同一資源并導致Java運行時更慢地執(zhí)行一個或多個線程,甚至暫停它們執(zhí)行,饑餓和活鎖是線程競爭的形式。 本節(jié)包括以下主題: 線程干擾描述了當多個線程訪問共享數(shù)據(jù)時如何引入錯誤。...
高級并發(fā)對象 到目前為止,本課程重點關(guān)注從一開始就是Java平臺一部分的低級別API,這些API適用于非?;A(chǔ)的任務,但更高級的任務需要更高級別的構(gòu)建塊,對于充分利用當今多處理器和多核系統(tǒng)的大規(guī)模并發(fā)應用程序尤其如此。 在本節(jié)中,我們將介紹Java平臺5.0版中引入的一些高級并發(fā)功能,大多數(shù)這些功能都在新的java.util.concurrent包中實現(xiàn),Java集合框架中還有新的并發(fā)數(shù)據(jù)結(jié)構(gòu)。 ...
摘要:否則它就會用新的值替代當前值。在這種情況下,鎖可能會優(yōu)于原子變量,但在實際的爭用級別中,原子變量的性能優(yōu)于鎖。在中引入了另外一個構(gòu)件。 題目要求 在我們深入了解CAS(Compare And Swap)策略以及它是如何在AtomicInteger這樣的原子構(gòu)造器中使用的,首先來看一下這段代碼: public class MyApp { private volatile int ...
摘要:有可能一個線程中的動作相對于另一個線程出現(xiàn)亂序。當實際輸出取決于線程交錯的結(jié)果時,這種情況被稱為競爭條件。這里的問題在于代碼塊不是原子性的,而且實例的變化對別的線程不可見。這種不能同時在多個線程上執(zhí)行的部分被稱為關(guān)鍵部分。 為什么要額外寫一篇文章來研究volatile呢?是因為這可能是并發(fā)中最令人困惑以及最被誤解的結(jié)構(gòu)。我看過不少解釋volatile的博客,但是大多數(shù)要么不完整,要么難...
閱讀 2612·2021-11-22 09:34
閱讀 997·2021-11-19 11:34
閱讀 2836·2021-10-14 09:42
閱讀 1523·2021-09-22 15:27
閱讀 2415·2021-09-07 09:59
閱讀 1769·2021-08-27 13:13
閱讀 3459·2019-08-30 11:21
閱讀 802·2019-08-29 18:35