• Java并发AtomicBoolean类的使用


    一、AtomicBoolean类介绍
            java.util.concurrent.atomic.AtomicBoolean类提供了可以原子读取和写入的底层布尔值的操作,并且还包含高级原子操作。 AtomicBoolean支持基础布尔变量上的原子操     作。 它具有获取和设置方法,如在volatile变量上的读取和写入。 也就是说,一个集合与同一变量上的任何后续get相关联。 原子compareAndSet方法也具有这些内存一致性功能。
    二、tomicBoolean类中的方法  

         以下是AtomicBoolean类中可用的重要方法的列表。

    序号方法描述
    1 public boolean compareAndSet(boolean expect, boolean update) 如果当前值==期望值,则将该值原子设置为给定的更新值。
    2 public boolean get() 返回当前值。
    3 public boolean getAndSet(boolean newValue) 将原子设置为给定值并返回上一个值。
    4 public void lazySet(boolean newValue) 最终设定为给定值。
    5 public void set(boolean newValue) 无条件地设置为给定的值。
    6 public String toString() 返回当前值的String表示形式。
    7 public boolean weakCompareAndSet(boolean expect, boolean update) 如果当前值==期望值,则将该值原子设置为给定的更新值。
    三、案例

      以下程序显示了基于线程的环境中AtomicBoolean变量的使用。

      
     1 package testAtomicBoolean;
     2 
     3 import java.util.concurrent.TimeUnit;
     4 
     5 public class mainWork {
     6     public static void main(final String[] arg) throws InterruptedException{
     7         Work work = new Work();
     8         work.start();
     9         TimeUnit.SECONDS.sleep(1);  //暂停一秒
    10         work.stop();    
    11     }
    12 }
    View Code
     1 package testAtomicBoolean;
     2 
     3 import java.util.concurrent.atomic.AtomicBoolean;
     4 
     5 public class Work {
     6     private AtomicBoolean flag;
     7     
     8     public Work() {
     9             this.flag = new AtomicBoolean(false);//通过构造函数加载时赋值(默认false)
    10     }
    11     
    12     /**
    13      * 启动线程
    14      */
    15     public void start() {
    16             //方法一
    17             /*if(!flag.get()) {//get()返回当前值
    18                     synchronized(flag){
    19                         flag.set(true);//设定给定制
    20                         System.out.println("Work------开始执行!");
    21                     }
    22             }else {
    23                 System.out.println("Work之前已经开始了!");
    24             }*/
    25         //方法二
    26         System.out.println("flag修改前值------"+flag.get());
    27             if(flag.compareAndSet(false, true)) {
    28                 System.out.println("Work------开始执行!");
    29                 System.out.println("flag修改后值------"+flag.get());
    30             }
    31     }
    32     
    33     /**
    34      * 停止线程
    35      */
    36     public void stop() {
    37         if(flag.get()) {//get()返回当前值
    38             synchronized(flag){
    39                 System.out.println("Work------已经停止!");
    40                 flag.set(false);//设定给定制
    41             }
    42         }else {
    43             System.out.println("Work之前已经停止了!");
    44         }
    45     }
    46 }
    View Code

      运行结果:flag修改前值------false
           Work------开始执行!
             flag修改后值------true
             Work------已经停止!
         注:学习之旅,如有不正确,多多指教。



     
  • 相关阅读:
    第一阶段
    堆栈的内容------全局变量(实例变量)---静态变量等等
    this和引用变量的地址值是同一个---------new后面的是构造方法
    引用数据类型的传递,那个值先输出,后面的也同样是同一个值
    基本数据类型的传递,参数传递的是具体的值
    构造方法和构造代码块
    装饰器初识
    Bootstrap框架
    Django ORM那些相关操作
    jQuery
  • 原文地址:https://www.cnblogs.com/sqw8080/p/10901516.html
Copyright © 2020-2023  润新知