原子更新基本类型

原子更新数组

原子更新抽象类型

原子更新字段

原子更新基本类型:

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(); //
next = prev + 1;
boolean flag = cas(prev, next);
if (flag) {
return prev;
}else {
go to 1
}

最新文章

  1. 【java】jackson 中JsonFormat date类型字段的使用
  2. 3ds max 分离对象
  3. 通知栏Notification的学习
  4. Speed-BI数据分析案例:2016年7月汽车销量排行榜
  5. 设计师眼中功能强大的Xcode
  6. c语言中 int *p = NULL 和 *p = NULL 有什么区别
  7. 如何写一个网页标题title的闪动提示(转)
  8. keil 中用函数指针调用函数的参数限制
  9. ftk学习记录(形成全屏幕套件)
  10. POJ 2231 Moo Volume
  11. linux下提示bash:command not found
  12. Python爬虫01——第一个小爬虫
  13. Java中的回调
  14. JavaScript八张思维导图—编程实践
  15. 爬虫下载校花网美女信息-lxml
  16. jQuery实现动态分割div
  17. atom那些事儿
  18. CTE(公用表表达式)
  19. 介绍HTTP协议的传输过程
  20. gym101522 [小熊骑士限定]La Salle-Pui Ching Programming Challenge 培正喇沙編程挑戰賽 2017

热门文章

  1. 1+X证书学习日志——函数
  2. 判断是否发生url跳转
  3. LINQ按多列分组(Group By)并计算总和(Sum) (转载)
  4. 基于NFS的PV动态供给(StorageClass)
  5. Qt5安装及组件选择(Qt 5.12.0)
  6. 使用Cloudera Manager部署oozie
  7. Linux postfix配置方法
  8. python---Numpy模块中线性代数运算,统计和数学函数
  9. 使用Python的turtle库实现六角形以及正方形螺旋线的绘制
  10. js的异常处理 try catch