java线程并发包util.concurrent的研究(三)
2005-01-14 19:52
621 查看
原子类
在Dawid Kurzyniec先生的util.concurrent包中最基本的类就是在edu.mory.mathcs.backport.java.util.concurrent.atomic中的原子类了。
下面本人先从AtomicInteger类look。。
AtomicInteger类说明:
一个整数值可以被原子地更新。一个AtomicInteger作为原子增长计数器被用在应用程序中,不能够替换java.lang.Integer使用。但是这个类是Number抽象类的扩展,可以被处理基于number类的工具访问。
以下便是AtomicInteger的源代码:
//AtomicInteger类扩展了Number类,并且可序列化
public class AtomicInteger extends Number implements java.io.Serializable {
private static final long serialVersionUID = 6214790243416807050L;
//整数值
private int value;
/**
* 使用初始化值构造一个AtomicInteger.
*
* @param 初始化值
*/
public AtomicInteger(int initialValue) {
value = initialValue;
}
/**
* 使用0构造一个AtomicInteger..
*/
public AtomicInteger() {
}
/**
* 获取AtomicInteger的值.
*
* @return 返回AtomicInteger的当前值
*/
public final synchronized int get() {
return value;
}
/**
* 给AtomicInteger赋新值
*
* @param 传入的新值
*/
public final synchronized void set(int newValue) {
value = newValue;
}
/**
* 设置新值,返回旧值.
*
* @param 传入的新值
* @return 返回旧值
*/
public final synchronized int getAndSet(int newValue) {
int old = value;
value = newValue;
return old;
}
/**
* 原子地更新指定值为新值
* 如果当前值等于期待的值(expect)
* @param 期待的值
* @param 传入的新值
* @return 如果更新成功,返回true。否则返回False
*/
public final synchronized boolean compareAndSet(int expect, int update) {
boolean success = (expect == value);
if (success)
value = update;
return success;
}
/**
* 原子地更新指定值为新值
* 如果当前值等于期待值(expect).
* 可能会不真实的失败.
* @param 期待值
* @param 传入的新值
* @return如果更新成功,返回true。
*/
public final synchronized boolean weakCompareAndSet(int expect, int update) {
boolean success = (expect == value);
if (success)
value = update;
return success;
}
/**
* 原子地递增1
* @return 返回增加前的旧值
*/
public final synchronized int getAndIncrement() {
return value++;
}
/**
* 原子地递增1
* @return 返回增加后的新值
*/
public final synchronized int incrementAndGet() {
return ++value;
}
/**
* 原子地递减1
* @return 返回递减前的旧值
*/
public final synchronized int getAndDecrement() {
return value--;
}
/**
* 原子地递减1
* @return 返回递减后的新值
*/
public final synchronized int decrementAndGet() {
return --value;
}
/**
* 原子地增加某个增量(delta)
* @param 增量delta
* @return 返回增加前的旧值
*/
public final synchronized int getAndAdd(int delta) {
int old = value;
value += delta;
return old;
}
/**
* 原子地增加某个增量(delta)
* @param增量delta
* @return返回增加后的新值
*/
public final synchronized int addAndGet(int delta) {
return value += delta;
}
/**
* 原子地更新旧值为新值
*
* @param 传入的新值
* @return 返回旧值
*/
public final synchronized int getAndSet(int newValue) {
int old = value;
value = newValue;
return old;
}
/**
* 返回当前值的字符串表达式.
* @return返回当前值的字符串表达式.
*/
public String toString() {
return Integer.toString(get());
}
public int intValue() {
return get();
}
public long longValue() {
return (long)get();
}
public float floatValue() {
return (float)get();
}
public double doubleValue() {
return (double)get();
}
}
总得来说,基本工作原理是使用了同步synchronized的方法实现了对一个整型数值的增、减、赋值(更新)。使对AtomicInteger的值操作成为原子操作。
另外的AtomicLong、AtomicLongArray、AtomicIntegerArray、AtomicBoolean、AtomicReference、AtomicMarkableReference、AtomicReferenceArray、AtomicStampedReference类的工作原理同理。
在Dawid Kurzyniec先生的util.concurrent包中最基本的类就是在edu.mory.mathcs.backport.java.util.concurrent.atomic中的原子类了。
下面本人先从AtomicInteger类look。。
AtomicInteger类说明:
一个整数值可以被原子地更新。一个AtomicInteger作为原子增长计数器被用在应用程序中,不能够替换java.lang.Integer使用。但是这个类是Number抽象类的扩展,可以被处理基于number类的工具访问。
以下便是AtomicInteger的源代码:
//AtomicInteger类扩展了Number类,并且可序列化
public class AtomicInteger extends Number implements java.io.Serializable {
private static final long serialVersionUID = 6214790243416807050L;
//整数值
private int value;
/**
* 使用初始化值构造一个AtomicInteger.
*
* @param 初始化值
*/
public AtomicInteger(int initialValue) {
value = initialValue;
}
/**
* 使用0构造一个AtomicInteger..
*/
public AtomicInteger() {
}
/**
* 获取AtomicInteger的值.
*
* @return 返回AtomicInteger的当前值
*/
public final synchronized int get() {
return value;
}
/**
* 给AtomicInteger赋新值
*
* @param 传入的新值
*/
public final synchronized void set(int newValue) {
value = newValue;
}
/**
* 设置新值,返回旧值.
*
* @param 传入的新值
* @return 返回旧值
*/
public final synchronized int getAndSet(int newValue) {
int old = value;
value = newValue;
return old;
}
/**
* 原子地更新指定值为新值
* 如果当前值等于期待的值(expect)
* @param 期待的值
* @param 传入的新值
* @return 如果更新成功,返回true。否则返回False
*/
public final synchronized boolean compareAndSet(int expect, int update) {
boolean success = (expect == value);
if (success)
value = update;
return success;
}
/**
* 原子地更新指定值为新值
* 如果当前值等于期待值(expect).
* 可能会不真实的失败.
* @param 期待值
* @param 传入的新值
* @return如果更新成功,返回true。
*/
public final synchronized boolean weakCompareAndSet(int expect, int update) {
boolean success = (expect == value);
if (success)
value = update;
return success;
}
/**
* 原子地递增1
* @return 返回增加前的旧值
*/
public final synchronized int getAndIncrement() {
return value++;
}
/**
* 原子地递增1
* @return 返回增加后的新值
*/
public final synchronized int incrementAndGet() {
return ++value;
}
/**
* 原子地递减1
* @return 返回递减前的旧值
*/
public final synchronized int getAndDecrement() {
return value--;
}
/**
* 原子地递减1
* @return 返回递减后的新值
*/
public final synchronized int decrementAndGet() {
return --value;
}
/**
* 原子地增加某个增量(delta)
* @param 增量delta
* @return 返回增加前的旧值
*/
public final synchronized int getAndAdd(int delta) {
int old = value;
value += delta;
return old;
}
/**
* 原子地增加某个增量(delta)
* @param增量delta
* @return返回增加后的新值
*/
public final synchronized int addAndGet(int delta) {
return value += delta;
}
/**
* 原子地更新旧值为新值
*
* @param 传入的新值
* @return 返回旧值
*/
public final synchronized int getAndSet(int newValue) {
int old = value;
value = newValue;
return old;
}
/**
* 返回当前值的字符串表达式.
* @return返回当前值的字符串表达式.
*/
public String toString() {
return Integer.toString(get());
}
public int intValue() {
return get();
}
public long longValue() {
return (long)get();
}
public float floatValue() {
return (float)get();
}
public double doubleValue() {
return (double)get();
}
}
总得来说,基本工作原理是使用了同步synchronized的方法实现了对一个整型数值的增、减、赋值(更新)。使对AtomicInteger的值操作成为原子操作。
另外的AtomicLong、AtomicLongArray、AtomicIntegerArray、AtomicBoolean、AtomicReference、AtomicMarkableReference、AtomicReferenceArray、AtomicStampedReference类的工作原理同理。
相关文章推荐
- java线程并发包util.concurrent的研究(四)
- java线程并发包util.concurrent的研究(五)
- java线程并发包util.concurrent的研究(一)
- java线程并发包util.concurrent的研究(二)
- java线程并发包util.concurrent的研究(六)
- 线程并发线程安全介绍及java.util.concurrent包下类介绍
- 线程并发线程安全介绍及java.util.concurrent包下类介绍
- Java 并发工具包 java.util.concurrent 用户指南
- Java并发解决方案 java.util.concurrent
- 张孝祥java.concurrent线程并发学习笔记 - concurrent简介
- 高并发第八弹:J.U.C起航(java.util.concurrent)
- java.util.concurrent.atomic 并发包下的原子操作类(AtomicBoolean,AtomicInteger,AtomicLong......))
- Java 并发工具包-java.util.concurrent-源码jdk1.7全面解析
- 「java.util.concurrent并发包」之 ThreadPoolExecutor
- 「java.util.concurrent并发包」之 CyclicBarrier
- 「java.util.concurrent并发包」之 CopyOnWrite
- java并发编程:线程安全管理类--原子包--java.util.concurrent.atomic
- Android多线程研究(7)——Java5中的线程并发库
- Java 线程与并发研究系列一Executor简介与使用
- java并发包java.util.concurrent