java中的原子操作
2016-07-04 10:24
337 查看
Java中一共有以下几种原子操作:
(1).原子更新基本类:
AtomicBoolean:原子更新布尔类型
AtomicInteger:原子更新整型
AtomicLong:原子更新长整型
它们常用的方法:
int addAndGet(int delta):以原子方式将输入的数值与实例中的值(AtomicInteger里的value),并返回结果:
boolean compareAndSet(int index,int update):如果输入的数值等于预期的值,则以原子方式將该值设置为输入的值:
int getAndIncrement():以原子的方式将当前的值加1,注意:这里返回的是自增前的值。
void lazySet(int newvalue):最终会设置成newvalue,使用lazySet设置后,可能导致其他线程在之后的一小段时间内还是可以读到旧值的。
intGetAndSet(int newValue):以原子的方式设置为newValue的值,并返回结果:
(2).原子更新数组
AtomicIntegerArray:原子更新整型数组里的元素。
AtominLongArray:原子更新长整型数组里的元素
AtomicReferenceArray:原子更新引用类型数组里的元素。
AtomicIntegerArray:类主要提供原子的方式更新数组里的整型,其常用方法如下:
int addAndGet(int i,int delta)以原子的方式将输入值和数组中的索引i的元素相加:
boolean compareAndSet(int i,int expect,int ipdate):如果当前值等于预期值,则以原子方式将数组的位置i的元素设置成update值:
(3).以原子更新引用类型
原子更新基本类型的AtomicInteger,只能更新一个变量,如果要原子更新多个变量,就需要使用这个原子更新引用类型提供的类。
AtomicReference:原子更新引用类型
AtomcReferenceFieldUpdater:原子更新引用类型里的字段
AtomicMarkableReference:原子更新带有标记位的引用类型。可以原子更新一个布尔类型的标记位和引用类型。构造方法是AtomicMarkableReference(V initialRef,boolean initialMark)
package AtomicArray;
import java.util.concurrent.atomic.AtomicReference;
public class AtomicReferenceTest {
public static AtomicReference<User> atomicUserRef = new AtomicReference<User>();
static class User{
private String name;
private int old;
public User(String name,int old){
this.name = name;
this.old = old;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getOld() {
return old;
}
public void setOld(int old) {
this.old = old;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
User user = new User("张三",12);
atomicUserRef.set(user);
User update = new User("shishi",12);
atomicUserRef.compareAndSet(user, update);
System.out.println(atomicUserRef.get().getName());
}
}
(4).原子更新字段类
如果需要原子地更新某类里面的字段,就需要使用原子更新字段类了,Atomic包里提供了以下3个类进行原子字段更新操作。
AtomicIntegerFieldUpdater:原子更新整型的字段的更新器
AtomicLongFieldUpdater:原子更新长整型字段的更新器
AtomicStampedReference:原子更新带有版本号的引用类型。
package AtomicArray;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
public class AtomicIntegerFieldUpdaterTest {
//使用静态的方法newUpdater()创建一个更新器,必须指明要更新的类和字段。
private static AtomicIntegerFieldUpdater<User> a = AtomicIntegerFieldUpdater.newUpdater(User.class, "old");
public void main(String[] args){
User conan = new User("张三",12);
System.out.println(a.getAndIncrement(conan));
System.out.println(a.get(conan));
}
static class User{
private String name;
public volatile int old;
public User(String name, int old) {
super();
this.name = name;
this.old = old;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getOld() {
return old;
}
public void setOld(int old) {
this.old = old;
}
}
}
(1).原子更新基本类:
AtomicBoolean:原子更新布尔类型
AtomicInteger:原子更新整型
AtomicLong:原子更新长整型
它们常用的方法:
int addAndGet(int delta):以原子方式将输入的数值与实例中的值(AtomicInteger里的value),并返回结果:
boolean compareAndSet(int index,int update):如果输入的数值等于预期的值,则以原子方式將该值设置为输入的值:
int getAndIncrement():以原子的方式将当前的值加1,注意:这里返回的是自增前的值。
void lazySet(int newvalue):最终会设置成newvalue,使用lazySet设置后,可能导致其他线程在之后的一小段时间内还是可以读到旧值的。
intGetAndSet(int newValue):以原子的方式设置为newValue的值,并返回结果:
(2).原子更新数组
AtomicIntegerArray:原子更新整型数组里的元素。
AtominLongArray:原子更新长整型数组里的元素
AtomicReferenceArray:原子更新引用类型数组里的元素。
AtomicIntegerArray:类主要提供原子的方式更新数组里的整型,其常用方法如下:
int addAndGet(int i,int delta)以原子的方式将输入值和数组中的索引i的元素相加:
boolean compareAndSet(int i,int expect,int ipdate):如果当前值等于预期值,则以原子方式将数组的位置i的元素设置成update值:
(3).以原子更新引用类型
原子更新基本类型的AtomicInteger,只能更新一个变量,如果要原子更新多个变量,就需要使用这个原子更新引用类型提供的类。
AtomicReference:原子更新引用类型
AtomcReferenceFieldUpdater:原子更新引用类型里的字段
AtomicMarkableReference:原子更新带有标记位的引用类型。可以原子更新一个布尔类型的标记位和引用类型。构造方法是AtomicMarkableReference(V initialRef,boolean initialMark)
package AtomicArray;
import java.util.concurrent.atomic.AtomicReference;
public class AtomicReferenceTest {
public static AtomicReference<User> atomicUserRef = new AtomicReference<User>();
static class User{
private String name;
private int old;
public User(String name,int old){
this.name = name;
this.old = old;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getOld() {
return old;
}
public void setOld(int old) {
this.old = old;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
User user = new User("张三",12);
atomicUserRef.set(user);
User update = new User("shishi",12);
atomicUserRef.compareAndSet(user, update);
System.out.println(atomicUserRef.get().getName());
}
}
(4).原子更新字段类
如果需要原子地更新某类里面的字段,就需要使用原子更新字段类了,Atomic包里提供了以下3个类进行原子字段更新操作。
AtomicIntegerFieldUpdater:原子更新整型的字段的更新器
AtomicLongFieldUpdater:原子更新长整型字段的更新器
AtomicStampedReference:原子更新带有版本号的引用类型。
package AtomicArray;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
public class AtomicIntegerFieldUpdaterTest {
//使用静态的方法newUpdater()创建一个更新器,必须指明要更新的类和字段。
private static AtomicIntegerFieldUpdater<User> a = AtomicIntegerFieldUpdater.newUpdater(User.class, "old");
public void main(String[] args){
User conan = new User("张三",12);
System.out.println(a.getAndIncrement(conan));
System.out.println(a.get(conan));
}
static class User{
private String name;
public volatile int old;
public User(String name, int old) {
super();
this.name = name;
this.old = old;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getOld() {
return old;
}
public void setOld(int old) {
this.old = old;
}
}
}
相关文章推荐
- spring四种依赖注入方式
- SpringMVC源码总结(十一)mvc:interceptors拦截器介绍
- java冒泡排序Bubble sort
- Struts2 的Action中取得请求参数值的几种方法
- 二分查找法 java
- java基础语言写简单计算器
- spring AOP例子
- SpringMVC 自定义类型转换器
- MyEclipse创建maven项目
- Java基础——clone()方法浅析
- Spring3.2新注解@ControllerAdvice
- SpringMVC 拦截器
- 交换两个变量的值的两种简单算法
- java设计模式之享元模式
- java获取整形数据的二进制形式
- java 设计模式这观察者模式
- JavaWeb框架MVC设计思想详解
- java IO:java IO流总述
- Java1.5 新特性 可变参数
- 爬坑小记-Java里面的代码块讲解