原子更新基本类型
原子更新数组
原子更新抽象类型
原子更新字段
原子更新基本类型:
- package com.roocon.thread.t8;
- import java.util.concurrent.atomic.AtomicInteger;
- import java.util.concurrent.atomic.AtomicIntegerArray;
- public class Sequence { private AtomicInteger value = new AtomicInteger(0);
- private int [] s = {2,1,4,6};
- AtomicIntegerArray a = new AtomicIntegerArray(s);
- public int getNext(){
- a.getAndIncrement(2);// 给下标为 2 的元素加 1
- a.getAndAdd(2, 10);// 获取下标为 2 的元素, 并且加 10
- for (int i=0; i <a.length(); i++){
- System.out.println(a.get(i));
- }
- return value.getAndIncrement();
- }
- public static void main(String[] args) {
- Sequence sequence = new Sequence();
- new Thread(new Runnable() {
- @Override
- public void run() {
- while (true){
- System.out.println(Thread.currentThread().getName()+" "+sequence.getNext());
- try {
- Thread.sleep(100);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }).start();
- new Thread(new Runnable() {
- @Override
- public void run() {
- while (true){
- System.out.println(Thread.currentThread().getName()+" "+sequence.getNext());
- try {
- Thread.sleep(100);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }).start();
- new Thread(new Runnable() {
- @Override
- public void run() {
- while (true){
- System.out.println(Thread.currentThread().getName()+" "+sequence.getNext());
- try {
- Thread.sleep(100);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }).start();
- }
- }
运行结果:
- Thread-0 0
- Thread-1 1
- Thread-2 2
- Thread-0 3
- Thread-1 4
- Thread-2 5
- ...
- package com.roocon.thread.t8;
- import java.util.concurrent.atomic.AtomicInteger;
- import java.util.concurrent.atomic.AtomicIntegerArray;
- import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
- import java.util.concurrent.atomic.AtomicReference;
- public class Sequence {
- private AtomicInteger value = new AtomicInteger(0);
- AtomicReference<User> user = new AtomicReference<>(); // 对 user 的 set 和 get 执行原子操作
- AtomicIntegerFieldUpdater<User> old = AtomicIntegerFieldUpdater.newUpdater(User.class, "old");
- public int getNext(){
- User user = new User();
- System.out.println(old.getAndIncrement(user));
- System.out.println(old.getAndIncrement(user));
- System.out.println(old.getAndIncrement(user));
- return value.getAndIncrement();
- }
- public static void main(String[] args) {
- Sequence sequence = new Sequence();
- new Thread(new Runnable() {
- @Override
- public void run() {
- System.out.println(Thread.currentThread().getName()+" "+sequence.getNext());
- try {
- Thread.sleep(100);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }).start();
- }
- }
运行结果:
0 1 2 Thread-0 0
对 CAS 的源码理解:-- 初步理解
在 AtomicInteger 中有这样一段源码:
- public final int getAndUpdate(IntUnaryOperator updateFunction) {
- int prev, next;
- do {
- prev = get();
- next = updateFunction.applyAsInt(prev);
- } while (!compareAndSet(prev, next));
- return prev;
- }
- public final boolean compareAndSet(int expect, int update) {
- return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
- }
其中, compareAndSwap 就是 CAS 的缩写. 如果 prev 和 next 不相等, 则返回 true. 否则, 返回 false. 最终是通过 unsafe 来实现的.
以上代码表示, 如果 compareAndSet 返回 true, 则 while 条件为 false, 退出循环, 返回 prev 值. 如果 compareAndSet 返回 false, 则 while 为 true, 继续执行循环体, 重新获取 prev 的值, 重新获取更新值, 直到返回的 compareAndSet 值为 true.
演示源码大致步骤如下:
- Object prev = get(); //1
- next = prev + 1;
- boolean flag = cas(prev, next);
- if (flag) {
- return prev;
- }else {
- go to 1
- } Object pre
来源: http://www.bubuko.com/infodetail-2710682.html