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