1.类 AtomicIntegerFieldUpdater<T>

  public abstract class AtomicIntegerFieldUpdater<T> extends Object

    基于反射的实用工具,可以对指定类的指定 volatile int 字段进行原子更新。此类用于原子数据结构,该结构中同一节点的几个字段都独立受原子更新控制。

    注意,此类中 compareAndSet 方法的保证弱于其他原子类中该方法的保证。因为此类不能确保所有使用的字段都适合于原子访问目的,所以对于相同更新器上的 compareAndSetset 的其他调用,它仅可以保证原子性和可变语义。

2.构造函数详解

AtomicIntegerFieldUpdater

protected AtomicIntegerFieldUpdater()

受保护的无操作构造方法,供子类使用。

3.方法详解

newUpdater

public static <U> AtomicIntegerFieldUpdater<U> newUpdater(Class<U> tclass,
String fieldName)
使用给定字段为对象创建和返回一个更新器。需要 Class 参数来检查反射类型和一般类型是否匹配。

参数:
tclass - 保持字段的对象类
fieldName - 要更新的字段名称
返回:
更新器
抛出:
IllegalArgumentException - 如果该字段不是可变的整数类型
RuntimeException - 如果该类不保持字段,或者是错误的类型,则抛出 RuntimeException 和一个嵌套的基于反射的异常

compareAndSet

public abstract boolean compareAndSet(T obj,
int expect,
int update)
如果当前值 == 预期值,则以原子方式将此更新器所管理的给定对象的字段值设置为给定的更新值。对 compareAndSetset 的其他调用,此方法可以确保原子性,但对于字段中的其他更改则不一定确保原子性。

参数:
obj - 有条件地设置其字段的对象
expect - 预期值
update - 新值
返回:
如果成功,则返回 true
抛出:
ClassCastException - 如果 obj 不是类的实例(该类处理在构造方法中建立的字段)

weakCompareAndSet

public abstract boolean weakCompareAndSet(T obj,
int expect,
int update)
如果当前值 == 预期值,则以原子方式将此更新器所管理的给定对象的字段值设置为给定的更新值。对 compareAndSetset 的其他调用,此方法可以确保原子性,但对于字段中的其他更改则不一定确保原子性,并且可能会意外失败。

可能意外失败并且不提供排序保证,所以只有在很少的情况下才对 compareAndSet 进行适当地选择。

参数:
obj - 有条件地设置其字段的对象
expect - 预期值
update - 新值
返回:
如果成功,则返回 true
抛出:
ClassCastException - 如果 obj 不是类的实例(该类处理在构造方法中建立的字段)

set

public abstract void set(T obj,
int newValue)
将此更新器管理的给定对象的字段设置为给定更新值。对于 compareAndSet 的后续调用,此操作可以确保充当可变存储。

参数:
obj - 要设置其字段的对象
newValue - 新值

lazySet

public abstract void lazySet(T obj,
int newValue)
最后将此更新器管理的给定对象的字段设置为给定更新值。

参数:
obj - 要设置其字段的对象
newValue - 新值
从以下版本开始:
1.6

get

public abstract int get(T obj)
获取此更新器管理的在给定对象的字段中保持的当前值。

参数:
obj - 要获取其字段的对象
返回:
当前值

getAndSet

public int getAndSet(T obj,
int newValue)
以原子方式将此更新器管理的给定对象的字段设置为给定值,并返回旧值。

参数:
obj - 要获取并设置其字段的对象
newValue - 新值
返回:
以前的值

getAndIncrement

public int getAndIncrement(T obj)
以原子方式将此更新器管理的给定对象的当前值加 1。

参数:
obj - 要获取并设置其字段的对象
返回:
以前的值

getAndDecrement

public int getAndDecrement(T obj)
以原子方式将此更新器管理的给定对象的当前值减 1。

参数:
obj - 要获取并设置其字段的对象
返回:
以前的值

getAndAdd

public int getAndAdd(T obj,
int delta)
以原子方式将给定值添加到此更新器管理的给定对象的当前值。

参数:
obj - 要获取并设置其字段的对象
delta - 要加上的值
返回:
以前的值

incrementAndGet

public int incrementAndGet(T obj)
以原子方式将此更新器管理的给定对象的字段的当前值加 1。

参数:
obj - 要获取并设置其字段的对象
返回:
更新的值

decrementAndGet

public int decrementAndGet(T obj)
以原子方式将此更新器管理的给定对象的字段的当前值减 1。

参数:
obj - 要获取并设置其字段的对象
返回:
更新的值

addAndGet

public int addAndGet(T obj,
int delta)
以原子方式将给定值添加到此更新器管理的给定对象的字段当前值。

参数:
obj - 要获取并设置其字段的对象
delta - 要加上的值
返回:
更新的值

java并发编程:线程安全管理类--原子操作类--AtomicIntegerFieldUpdater<T>的更多相关文章

  1. java并发编程 线程基础

    java并发编程 线程基础 1. java中的多线程 java是天生多线程的,可以通过启动一个main方法,查看main方法启动的同时有多少线程同时启动 public class OnlyMain { ...

  2. Java 并发编程 | 线程池详解

    原文: https://chenmingyu.top/concurrent-threadpool/ 线程池 线程池用来处理异步任务或者并发执行的任务 优点: 重复利用已创建的线程,减少创建和销毁线程造 ...

  3. Java并发编程:线程间通信wait、notify

    Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...

  4. Java并发编程:线程和进程的创建(转)

    Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务.下面先讲述一下Java中的应用程序和进程相关的概念知识, ...

  5. java并发编程 | 线程详解

    个人网站:https://chenmingyu.top/concurrent-thread/ 进程与线程 进程:操作系统在运行一个程序的时候就会为其创建一个进程(比如一个java程序),进程是资源分配 ...

  6. java并发编程系列二:原子操作/CAS

    什么是原子操作 不可被中断的一个或者一系列操作 实现原子操作的方式 Java可以通过锁和循环CAS的方式实现原子操作 CAS( Compare And Swap )  为什么要有CAS? Compar ...

  7. Java并发编程——线程池的使用

    在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统 ...

  8. Java并发编程——线程池

    本文的目录大纲: 一.Java中的ThreadPoolExecutor类 二.深入剖析线程池实现原理 三.使用示例 四.如何合理配置线程池的大小 一.Java中的ThreadPoolExecutor类 ...

  9. Java并发编程(三)Thread类的使用

    一.线程的状态 线程从创建到最终的消亡,要经历若干个状态.一般来说,线程包括以下这几个状态:创建(new).就绪(runnable).运行(running).阻塞(blocked).time wait ...

  10. [转]JAVA并发编程学习笔记之Unsafe类

    1.通过Unsafe类可以分配内存,可以释放内存:类中提供的3个本地方法allocateMemory.reallocateMemory.freeMemory分别用于分配内存,扩充内存和释放内存,与C语 ...

随机推荐

  1. Python爬虫实例(五) requests+flask构建自己的电影库

    目标任务:使用requests抓取电影网站信息和下载链接保存到数据库中,然后使用flask做数据展示. 爬取的网站在这里 最终效果如下: 主页: 可以进行搜索:输入水形物语 点击标题进入详情页: 爬虫 ...

  2. elasticsearch-hadoop使用

    elasticsearch-hadoop是一个深度集成Hadoop和ElasticSearch的项目,也是ES官方来维护的一个子项目,通过实现Hadoop和ES之间的输入输出,可以在Hadoop里面对 ...

  3. mysql创建和删除表

    创建表 简单的方式 CREATE TABLE person ( ), name ), birthday DATE ); 或者是 CREATE TABLE IF NOT EXISTS person ( ...

  4. glog安装与使用

    window环境下glog的安装 载后解压,利用Visual Studio打开google-glog.sln.生成解决方案 打开sln会有几个项目,libglog是动态库,生成dll,libglog_ ...

  5. HTML格式布局

    一.position:fixed 锁定位置(相对于浏览器的位置),例如有些网站的右下角的弹出窗口. #top { border:1px solid #; height:100px; width:966 ...

  6. 测试人必备:国内外最好用的6款Bug跟踪管理系统

    在移动互联网产品中,Bug会导致软件产品在某种程度上不能满足用户的需要.确保一个项目进展顺利,关键在于妥善处理软件中的BUG,那么,如何高效的管理BUG,解决BUG?在这里,我为大家搜集了几款优秀的B ...

  7. LabView和DLL中的参数问题

    注意:在LabView中调用DLL函数时,一定要指定对应的参数类型,而不是选择“Adapt to Type”,否则会出错,不知道为什么书上是要选择“Adapt to Type”. 以下做个参考: 转自 ...

  8. poj1496 Word Index / poj1850 Code(组合数学)

    poj1850 Code 题意:输出若干个给定的字符串($length<=10$)在字典序中的位置,字符串中的字母必须严格递增. 读取到非法字符串时,输出“0”,终止程序.(poj1496:继续 ...

  9. Windows10系统远程桌面连接出现卡顿如何解决

    最新的windows10系统下,用户只要开启远程桌面连接,就能够轻松地操控其他电脑.但是,最近部分用户在win10中启用远程连接时,发现电脑窗口变得非常缓慢卡顿,这是怎么回事呢?其实,该问题与系统的设 ...

  10. log4j2配置按照日志级别将日志输出到不同的文件

    背景 在项目中,可能会产生非常多的日志记录,为了方便日志分析,可以将日志按级别输出到指定文件. log4j2.xml配置文件 <!--将info级别的日志单独输出到info.log中--> ...