99偷拍视频精品区一区二,口述久久久久久久久久久久,国产精品夫妇激情啪发布,成人永久免费网站在线观看,国产精品高清免费在线,青青草在线观看视频观看,久久久久久国产一区,天天婷婷久久18禁,日韩动漫av在线播放直播

怎么實現JavaJDK沒有提供的AtomicFloat

本篇內容主要講解“怎么實現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”有了更深的了解,不妨來實際操作一番吧!這里是創新互聯網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

文章題目:怎么實現JavaJDK沒有提供的AtomicFloat
當前鏈接:http://www.yijiale78.com/article2/ihdcoc.html

成都網站建設公司_創新互聯,為您提供域名注冊外貿建站移動網站建設App設計網站營銷App開發

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都網站建設