成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java 原子變量中set()和lazySet()的區別,你會了嗎?

開發 前端
我們并不清楚什么時候應該使用lazySet(),因為它與set()的區別很微妙。我們需要仔細分析這個問題,不僅要確保我們會得到性能上的提升,還要確保在多線程環境下的正確性。

大家好,我是指北君。

在本教程中,我們將講講 Java atomic 類(如 AtomicInteger 和 AtomicReference )的方法 set() 和 lazySet() 之間的區別。

原子變量

Java中的原子變量使我們能夠輕松地對類的引用或字段進行線程安全的操作,而不需要添加監視器或互斥等并發原語。

它們被定義在 java.util.concurrent.atomic 包下,雖然它們的API根據原子類型的不同而不同,但大多數都支持set()和lazySet()方法。

為了簡單起見,我們將在本文中使用 AtomicReference 和 AtomicInteger,但同樣的原則適用于其他原子類型。

The set() 方法

在調用set()后,當我們從不同的線程使用get()方法訪問該字段時,該變化是立即可見的。這意味著該值被從CPU緩存中刷新到了所有CPU核共有的內存層。為了展示上述功能,讓我們創建一個最小的 producer-consumer 控制臺應用。

  public class Application {

AtomicInteger atomic = new AtomicInteger(0);

public static void main(String[] args) {
Application app = new Application();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
app.atomic.set(i);
System.out.println("Set: " + i);
Thread.sleep(100);
}
}).start();

new Thread(() -> {
for (int i = 0; i < 10; i++) {
synchronized (app.atomic) {
int counter = app.atomic.get();
System.out.println("Get: " + counter);
}
Thread.sleep(100);
}
}).start();
}
}

在控制臺,我們應該看到一系列的 "設置 "和 "獲取 "信息。

    Set: 3
Set: 4
Get: 4
Get: 5

表明緩存一致性的是,"Get "語句中的值總是等于或大于其上方的 "Set "語句中的值。。

這種行為雖然非常有用,但也帶來了性能上的影響。如果我們能在不需要緩存一致性的情況下避免它,那就太好了。

The lazySet() 方法

lazySet()方法與set()方法相同,但沒有緩存刷新。

換句話說,我們的變化最終只對其他線程可見。這意味著從不同的線程對更新的 AtomicReference 調用 get()可能會給我們帶來舊的值。

為了看到這一點,讓我們在之前的控制臺應用程序中改變第一個線程的Runnable。

for (int i = 0; i < 10; i++) {
app.atomic.lazySet(i);
System.out.println("Set: " + i);
Thread.sleep(100);
}

新的 "設置 "和 "獲取 "信息可能不總是遞增的。

Set: 4
Set: 5
Get: 4
Get: 5

由于線程的特性,我們可能需要重新運行幾次應用程序,以便觸發這種行為。盡管生產者線程已經將AtomicInteger設置為5,但消費者線程還是先檢索到了值4,這意味著當lazySet()被使用時,系統最終是一致的。

在更多的技術術語中,我們說lazySet()方法在代碼中不作為發生在前的邊,與它們的set()對應的方法相反。

什么時候使用lazySet()?

我們并不清楚什么時候應該使用lazySet(),因為它與set()的區別很微妙。我們需要仔細分析這個問題,不僅要確保我們會得到性能上的提升,還要確保在多線程環境下的正確性。

我們可以使用的一種方式是,一旦我們不再需要一個對象的引用,就用null替換它。這樣,我們表明該對象有資格進行垃圾回收,而不會產生任何性能上的損失。我們假設其他線程可以使用廢棄的值,直到他們看到AtomicReference是null。不過一般來說,我們應該使用lazySet(),當我們想對一個原子變量進行修改,而且我們知道這個修改不需要立即對其他線程可見。

總結

在這篇文章中,我們看了原子類的set()和lazySet()方法之間的區別。我們還學習了何時使用哪種方法。

責任編輯:武曉燕 來源: Java技術指北
相關推薦

2024-01-18 09:38:00

Java注解JDK5

2024-01-19 08:25:38

死鎖Java通信

2023-10-13 09:04:09

2023-09-06 11:31:24

MERGE用法SQL

2022-09-26 11:03:25

Java反射漏洞

2023-07-10 08:36:21

工具pptword

2022-05-06 08:26:32

JavaSPI機制

2024-04-28 08:24:27

分布式架構Istio

2024-02-02 11:03:11

React數據Ref

2022-07-08 09:27:48

CSSIFC模型

2025-06-20 09:57:42

2022-08-29 07:05:02

JSRJava語言

2023-06-05 08:36:04

SQL函數RANK()

2024-03-04 07:41:18

SpringAOPOOP?

2025-01-14 08:32:55

JWT令牌.NET

2023-08-01 12:51:18

WebGPT機器學習模型

2024-01-02 12:05:26

Java并發編程

2022-04-01 08:23:17

InputstreString字符串

2024-02-04 00:00:00

Effect數據組件

2023-07-26 13:11:21

ChatGPT平臺工具
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品自拍视频 | 成人一级黄色毛片 | 中文字幕精品视频 | 久久久久久久久国产 | 精品91视频| 99精品在线观看 | 午夜国产羞羞视频免费网站 | 一级免费看 | 欧美不卡视频 | 中文字幕在线观看一区二区 | 99re超碰 | 狠狠操婷婷 | 四虎影院新网址 | av一区二区在线观看 | 欧美一级欧美三级在线观看 | 亚洲人成人一区二区在线观看 | 国产999精品久久久久久 | 亚洲小视频在线观看 | 亚洲在线看 | 一级毛片在线播放 | 中文字幕一区二区三区日韩精品 | 午夜私人影院在线观看 | 91精品国产手机 | 国产欧美日韩久久久 | 亚洲www啪成人一区二区 | 亚洲免费人成在线视频观看 | 久久精品亚洲一区二区三区浴池 | 免费一级淫片aaa片毛片a级 | 一区二区av在线 | 久久午夜视频 | 欧美成人一级视频 | 欧美亚州综合 | 精品国产乱码久久久 | 99综合在线 | 国产精品av久久久久久久久久 | 一区二区精品 | 天堂一区 | 精品欧美一区二区在线观看欧美熟 | 九九在线视频 | 欧美精品在线免费观看 | 最新av在线播放 |