java并发AtomicIntegerFieldUpdater
java并发AtomicIntegerFieldUpdater
支持对象的成员变量原子操作类由AtomicIntegerFieldUpdater,AtomicLongFieldUpdater,
AtomicReferenceFieldUpdater。
AtomicIntegerFieldUpdater的使用特点
它的API我还无法细致的掌握,它的使用有三点注意事项:
1.成员变量不能是私有的
2.int类型必须是volatile
3.它的实现是基于反射
以前有同事说过能不用反射就不要反射,很危险。我在写下面例子的时候,没有保证上面的两点,结果写的没有报错,
但在运行时候就报错了,我们应该知道编译期的错误IDE都能检查出来,可见反射用得不好,只有运行才能发现。
我认为它的实现之所以是基于反射就是因为成员变量的使用恰恰实在运行期。
下面的例子就是这样的一个示范。
简单例子
package javalearn.javabase.thread.atomic;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
import java.util.concurrent.atomic.AtomicLongFieldUpdater;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
@Slf4j
public class AtomicLongfiledupdaterTest {
public static void main(String[] args) {
//AtomicLongFieldUpdater atomicLongFieldUpdater;
//AtomicReferenceFieldUpdater atomicReferenceFieldUpdater;
AtomicIntegerFieldUpdater atomicIntegerFieldUpdater =AtomicIntegerFieldUpdater.newUpdater(Persion.class
,"id");
Persion p1 =new Persion("jack",1);
log.info("persion p1 is {}",p1.toString());
atomicIntegerFieldUpdater.getAndIncrement(p1);
log.info("persion p1 is {}",p1.toString());
}
@AllArgsConstructor
@Data
@ToString
static class Persion {
protected String name;
protected volatile int id;
}
}
例子结果
22:50:00.418 [main] INFO javalearn.javabase.thread.atomic.AtomicLongfiledupdaterTest - persion p1 is AtomicLongfiledupdaterTest.Persion(name=jack, id=1)
22:50:00.425 [main] INFO javalearn.javabase.thread.atomic.AtomicLongfiledupdaterTest - persion p1 is AtomicLongfiledupdaterTest.Persion(name=jack, id=2)
Process finished with exit code 0
java并发AtomicIntegerFieldUpdater的更多相关文章
- JAVA并发编程J.U.C学习总结
前言 学习了一段时间J.U.C,打算做个小结,个人感觉总结还是非常重要,要不然总感觉知识点零零散散的. 有错误也欢迎指正,大家共同进步: 另外,转载请注明链接,写篇文章不容易啊,http://www. ...
- Java并发编程-总纲
Java 原生支持并发,基本的底层同步包括:synchronized,用来标示一个方法(普通,静态)或者一个块需要同步执行(某一时刻,只允许一个线程在执行代码块).volatile,用来标识一个变量是 ...
- Java并发编程75道面试题及答案
1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon( ...
- java并发编程知识点备忘
最近有在回顾这方面的知识,稍微进行一些整理和归纳防止看了就忘记. 会随着进度不断更新内容,比较零散但尽量做的覆盖广一点. 如有错误烦请指正~ java线程状态图 线程活跃性问题 死锁 饥饿 活锁 饥饿 ...
- Java并发编程75个问答
1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon( ...
- Java并发编程73道面试题及答案
原文出处:https://blog.csdn.net/qq_34039315/article/details/7854931 1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线 ...
- Java并发编程73道面试题及答案 —— 面试稳了
今天主要整理一下 Java 并发编程在面试中的常见问题,希望对需要的读者有用. 1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任 ...
- Java并发编程指南
多线程是实现并发机制的一种有效手段.在 Java 中实现多线程有两种手段,一种是继承 Thread 类,另一种就是实现 Runnable/Callable 接口. java.util.concurre ...
- Java——并发编程
1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon( ...
随机推荐
- JS-正则表达式常规运用
限制文本框只能输入0和正数 <input type="text" onkeyup="this.value=this.value.replace(/\D/g,'')& ...
- python导入openpyxl报错问题,终于解决啦
问题:折腾了一上午,安装.卸载openpyxl多次,cmd中明明显示安装成功,可python文件import时就是报错 1.安装openpyxl后,python文件导入一直报错,经过一上午的努力,终于 ...
- Vue如何用虚拟dom进行渲染view的
前提 vue版本:v2.5.17-beta.0 触发render vue在数据更新后会自动触发view的render工作,其依赖于数据驱动:在数据驱动的工作下,每一个vue的data属性都被监听,并且 ...
- Linux - 删除文件的正确方式
mv <file> /tmp/ cp <file> /opt/file.bak rm
- Linux - 查看所有服务状态
ubuntu: service --status-all 例如可查看ssh, apache2等服务是否开启
- win10配置cuda和pytorch
简介 pytorch是非常流行的深度学习框架.下面是Windows平台配置pytorch的过程. 一共需要安装cuda.pycharm.anancoda.pytorch. 主要介绍cuda和pytor ...
- POJ 1204 Word Puzzles(AC自动机)
这题的数据卡在,如下: 5 5 3 ABCDE FGHIJ KLMNO PQRST UVWXY PQR RS RST puzzle中间的行中可以包含要查询的多个单词.这个问题很好解决,SearchDf ...
- 13. 为什么我们会需要 Pod?
13. 为什么我们会需要 Pod? 13.1 docker容器的本质 """ docker容器的本质 是进程. 主要通过 Namespace 做隔离,Cgroups 做限 ...
- ETCD实战
一.建立集群 1.在每台机器上建立环境变量 TOKEN=token-01 CLUSTER_STATE=new NAME_1=machine-1 NAME_2=machine-2 NAME_3=mach ...
- HDU1024 Max Sum Plus Plus (优化线性dp)
Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To be a brave ACMer, we ...