3 数组类型原子类 3.1 数组类型原子类介绍
使用原子的方式更新数组里的某个元素
上面三个类提供的方法几乎相同 , 所以我们这里以为例子来介绍 。
类常用方法
public final int get(int i) //获取 index=i 位置元素的值public final int getAndSet(int i, int newValue)//返回 index=i 位置的当前的值 , 并将其设置为新值:newValuepublic final int getAndIncrement(int i)//获取 index=i 位置元素的值 , 并让该位置的元素自增public final int getAndDecrement(int i) //获取 index=i 位置元素的值 , 并让该位置的元素自减public final int getAndAdd(int i, int delta) //获取 index=i 位置元素的值 , 并加上预期的值boolean compareAndSet(int i, int expect, int update) //如果输入的数值等于预期值 , 则以原子方式将 index=i 位置的元素值设置为输入值(update)public final void lazySet(int i, int newValue)//最终 将index=i 位置的元素设置为newValue,使用 lazySet 设置之后可能导致其他线程在之后的一小段时间内还是可以读到旧的值 。
3.2常见方法使用
import java.util.concurrent.atomic.AtomicIntegerArray;public class AtomicIntegerArrayTest {public static void main(String[] args) {// TODO Auto-generated method stubint temvalue = http://www.kingceram.com/post/0;int[] nums = { 1, 2, 3, 4, 5, 6 };AtomicIntegerArray i = new AtomicIntegerArray(nums);for (int j = 0; j < nums.length; j++) {System.out.println(i.get(j));}temvalue = i.getAndSet(0, 2);System.out.println("temvalue:" + temvalue + ";i:" + i);temvalue = http://www.kingceram.com/post/i.getAndIncrement(0);System.out.println("temvalue:" + temvalue + ";i:" + i);temvalue = http://www.kingceram.com/post/i.getAndAdd(0, 5);System.out.println("temvalue:" + temvalue + ";i:" + i);}}
4 引用类型原子类 4.1 引用类型原子类介绍
基本类型原子类只能更新一个变量 , 如果需要原子更新多个变量 , 需要使用 引用类型原子类 。
上面三个类提供的方法几乎相同 , 所以我们这里以为例子来介绍 。
4.2类使用示例
import java.util.concurrent.atomic.AtomicReference;public class AtomicReferenceTest {public static void main(String[] args) {AtomicReference ar = new AtomicReference();Person person = new Person("SnailClimb", 22);ar.set(person);Person updatePerson = new Person("Daisy", 20);ar.compareAndSet(person, updatePerson);System.out.println(ar.get().getName());System.out.println(ar.get().getAge());}}class Person {private String name;private int age;public Person(String name, int age) {super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
上述代码首先创建了一个对象 , 然后把对象设置进对象中 , 然后调用方法 , 该方法就是通过 CAS 操作设置 ar 。如果 ar 的值为的话 , 则将其设置为。实现原理与类中的方法相同 。运行上面的代码后的输出结果如下:
Daisy20
4.3 ce 类使用示例
import java.util.concurrent.atomic.AtomicStampedReference;public class AtomicStampedReferenceDemo {public static void main(String[] args) {// 实例化、取当前值和 stamp 值final Integer initialRef = 0, initialStamp = 0;final AtomicStampedReference
- 潘美是《杨家将》潘仁美的原型吗?他为人怎样?
- AI绘画——了解AI绘画爆火原因与工具,并生成几个端午绘画小作品
- 财路网每日原创推送:区块链3.0时代:资产上链将助攻实体经济未来?
- Java多线程进阶面试-Atomic 原子类
- 贞观四年发生一事李渊心悦诚服原谅李世民篡位
- 比原链资产上链研究一:资产从固态到气态
- 揭秘西游记为什么会发生在唐朝有何历史原因
- Mac:SnowLeopard原版 移动硬盘安装黑苹果+Xcode4.2
- 进PE系统后看不到硬盘的原因及解决办法
- 古人结婚要陪嫁筷子!真相原来是这样