日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android AtomicBoolean类的使用

發布時間:2024/4/15 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android AtomicBoolean类的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


今天,簡潔講講如何使用 

AtomicBoolean這個類。


在java.util.concurrent.atomic包下,有AtomicBoolean , AtomicInteger, AtomicLong, AtomicReference等類,它們的基本特性就是在多線程環境下,執行這些類實例包含的方法時,具有排他性,即當某個線程進入方法,執行其中的指令時,不會被其他線程打斷,而別的線程就像自旋鎖一樣,一直等到該方法執行完成,才由JVM從等待隊列中選擇一個另一個線程進入。


  • 介紹:

    ???????????

    ?????? 在這個Boolean值的變化的時候不允許在之間插入,保持操作的原子性

    • 方法和舉例
    • 1.compareAndSet(boolean?expect, boolean?update)

    ??????? 這個方法主要兩個作用 ??????? 1. 比較AtomicBoolean和expect的值,如果一致,執行方法內的語句。其實就是一個if語句 ??? ??? 2. 把AtomicBoolean的值設成update ??????? 比較最要的是這兩件事是一氣呵成的,這連個動作之間不會被打斷,任何內部或者外部的語句都不可能在兩個動作之間運行。為多線程的控制提供了解決的方案。


    這個函數應該是比較常用的,下面講講其他的基本使用。


    2.構造函數

      1.AtomicBoolean()

        使用初始值 false 創建新的 AtomicBoolean。

      2.AtomicBoolean(boolean?initialValue)

        使用給定的初始值創建新的 AtomicBoolean。

    3.方法詳解

    get

    public final boolean get()
    返回當前值。

    ?

    返回:
    當前值

    compareAndSet

    public final boolean compareAndSet(boolean?expect,boolean?update)
    如果當前值 == 預期值,則以原子方式將該值設置為給定的更新值。

    ?

    參數:
    expect - 預期值
    update - 新值
    返回:
    如果成功,則返回 true。返回 False 指示實際值與預期值不相等。

    weakCompareAndSet

    public boolean weakCompareAndSet(boolean?expect,boolean?update)
    如果當前值 == 預期值,則以原子方式將該值設置為給定的更新值。

    可能意外失敗并且不提供排序保證,因此幾乎只是 compareAndSet 的適當替代方法。

    參數:
    expect - 預期值
    update - 新值
    返回:
    如果成功,則返回 true。

    set

    public final void set(boolean?newValue)
    無條件地設置為給定值。

    ?

    參數:
    newValue - 新值

    lazySet

    public final void lazySet(boolean?newValue)
    最終設置為給定值。

    ?

    參數:
    newValue - 新值
    從以下版本開始:
    1.6

    getAndSet

    public final boolean getAndSet(boolean?newValue)
    以原子方式設置為給定值,并返回以前的值。

    ?

    參數:
    newValue - 新值
    返回:
    以前的值

    toString

    public String toString()
    返回當前值的字符串表示形式。

    ?

    覆蓋:
    類 Object 中的 toString
    返回:
    當前值的字符串表示形式。


    下面簡單舉一個使用的例子。

    以AtomicBoolean為例,單線程執行普通的方法(如下),不會出現線程問題:

    package com.secbro.test.atomic;/*** @author zhuzhisheng* @Description* @date on 2016/5/26.*/ public class NormalBoolean implements Runnable{public static boolean exits = false;private String name;public NormalBoolean(String name){this.name = name;}@Overridepublic void run() {if(!exits){exits = true;System.out.println(name + ",step 1");System.out.println(name + ",step 2");System.out.println(name + ",step 3");exits = false;} else {System.out.println(name + ",step else");}}public static void main(String[] args) {new NormalBoolean("張三").run();} }


    然而,當多線程執行時,就會出現在執行判斷之后的命令時,會有其他線程插入,變更exits的值。如下段代碼:

    package com.secbro.test.atomic;/*** @author zhuzhisheng* @Description* @date on 2016/5/26.*/ public class NormalBoolean2 implements Runnable{public static boolean exits = false;private String name;public NormalBoolean2(String name) {this.name = name;}@Overridepublic void run() {if(!exits){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}exits = true;System.out.println(name + ",step 1");System.out.println(name + ",step 2");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(name + ",step 3");exits = false;} else {System.out.println(name + ",step else");}} }

    同時執行兩線程,打印結果為:

    張三,step 1 李四,step 1 張三,step 2 李四,step 2 張三,step 3 李四,step 3


    現在,使用AtomicBoolean就可以確保多線程的情況下安全的運行,只有一個線程進行業務處理。

    package com.secbro.test.atomic;import java.util.concurrent.atomic.AtomicBoolean;/*** @author zhuzhisheng* @Description* @date on 2016/5/26.*/ public class TestAtomicBoolean implements Runnable{public static AtomicBoolean exits = new AtomicBoolean(false);private String name;public TestAtomicBoolean(String name) {this.name = name;}@Overridepublic void run() {if(exits.compareAndSet(false,true)){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(name + ",step 1");System.out.println(name + ",step 2");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(name + ",step 3");exits.set(false);} else {System.out.println(name + ",step else");}} }


    當兩個線程執行此類時,打印結果如下:

    張三,step else 李四,step 1 李四,step 2 李四,step 3


    測試類:

    package com.secbro.test.atomic;/*** @author zhuzhisheng* @Description* @date on 2016/5/26.*/ public class TestBoolean {public static void main(String[] args) {Thread thread1 = new Thread(new NormalBoolean2("李四"));Thread thread2 = new Thread(new NormalBoolean2("張三"));thread1.start();thread2.start();//-------------------------------------------------------Thread thread3 = new Thread(new TestAtomicBoolean("李四"));Thread thread4 = new Thread(new TestAtomicBoolean("張三"));thread3.start();thread4.start();} }


    這是將網上資料進行了這里,大家可以自己去查找資料看看。其實我也基本沒有使用過這個類,但是記錄一下。


    android? AtomicBoolean類的使用就講完了。


    就這么簡單。

總結

以上是生活随笔為你收集整理的android AtomicBoolean类的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。