91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么實現Java JDK沒有提供的AtomicFloat

發布時間:2021-07-28 17:16:48 來源:億速云 閱讀:145 作者:chen 欄目:云計算

本篇內容主要講解“怎么實現Java JDK沒有提供的AtomicFloat”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么實現Java JDK沒有提供的AtomicFloat”吧!

我們經常會使用AtomicInteger來做計數器,如下所示:

List<String> words = Files.readAllLines(Paths.get("src/main/resources/dic.txt"));
AtomicInteger i = new AtomicInteger();
words.parallelStream().forEach(word -> {
    //獲取word的同義詞、反義詞以及相關詞
    //......
    LOGGER.info("進度:" + total + "/" + i.incrementAndGet() + " 來自線程:" + Thread.currentThread());
});

在這段代碼中,我們需要注意兩點,一是parallelStream,二是變量i。

parallelStream的使用表示forEach中的代碼段有可能會在不同線程中并發執行,因此變量i的incrementAndGet方法要保證是原子操作,否則計數器的數據就可能會出錯。

沒啥問題,一切都還很美好,so far so nice。

有一天,我們的需求復雜了,我們需要的計數器不僅僅只是+1,而是要支持小數,如2.5,3.1等等,這有什么大不了的,我們把AtomicInteger換成AtomicFloat不就支持小數了嗎?

接著我們翻遍了JDK類庫,都沒有找到AtomicFloat,怎么回事呢?

最后終于在java.util.concurrent.atomic的package-summary.html頁面的最后部分發現了秘密:

Additionally, classes are provided only for those types that are commonly useful in intended applications. For example, there is no atomic class for representing byte. In those infrequent cases where you would like to do so, you can use an AtomicInteger to hold byte values, and cast appropriately. You can also hold floats using Float.floatToRawIntBits(float) andFloat.intBitsToFloat(int) conversions, and doubles using Double.doubleToRawLongBits(double) andDouble.longBitsToDouble(long) conversions.

接下來我們就可以利用AtomicInteger作為基礎來實現自己的AtomicFloat了,實現AtomicDouble和AtomicByte也是類似的做法,下面看看在word分詞中實現的AtomicFloat:

package org.apdplat.word.util;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 因為Java沒有提供AtomicFloat
 * 所以自己實現一個
 * @author 楊尚川
 */
public class AtomicFloat extends Number {

    private AtomicInteger bits;

    public AtomicFloat() {
        this(0f);
    }

    public AtomicFloat(float initialValue) {
        bits = new AtomicInteger(Float.floatToIntBits(initialValue));
    }

    public final float addAndGet(float delta){
        float expect;
        float update;
        do {
            expect = get();
            update = expect + delta;
        } while(!this.compareAndSet(expect, update));

        return update;
    }

    public final float getAndAdd(float delta){
        float expect;
        float update;
        do {
            expect = get();
            update = expect + delta;
        } while(!this.compareAndSet(expect, update));

        return expect;
    }

    public final float getAndDecrement(){
        return getAndAdd(-1);
    }

    public final float decrementAndGet(){
        return addAndGet(-1);
    }

    public final float getAndIncrement(){
        return getAndAdd(1);
    }

    public final float incrementAndGet(){
        return addAndGet(1);
    }

    public final float getAndSet(float newValue) {
        float expect;
        do {
            expect = get();
        } while(!this.compareAndSet(expect, newValue));

        return expect;
    }

    public final boolean compareAndSet(float expect, float update) {
        return bits.compareAndSet(Float.floatToIntBits(expect), Float.floatToIntBits(update));
    }

    public final void set(float newValue) {
        bits.set(Float.floatToIntBits(newValue));
    }

    public final float get() {
        return Float.intBitsToFloat(bits.get());
    }

    public float floatValue() {
        return get();
    }

    public double doubleValue() {
        return (double) floatValue();
    }

    public int intValue() {
        return (int) get();
    }

    public long longValue() {
        return (long) get();
    }

    public String toString() {
        return Float.toString(get());
    }
}

到此,相信大家對“怎么實現Java JDK沒有提供的AtomicFloat”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

井陉县| 洪洞县| 黔南| 台东市| 平乡县| 周至县| 湖北省| 静安区| 神木县| 武强县| 全南县| 西峡县| 广安市| 新龙县| 工布江达县| 五寨县| 高密市| 广南县| 乡城县| 南川市| 雷波县| 安陆市| 济宁市| 三门县| 阜新市| 石楼县| 金沙县| 枞阳县| 综艺| 揭西县| 泗洪县| 阳城县| 留坝县| 安福县| 六盘水市| 武陟县| 洛隆县| 兰溪市| 周至县| 锦州市| 黄冈市|