Java原子类操作

Java原子类操作

java的原子类放在java.util.concurrent.atomic包下面,常用的有以下这些类:

  • AtomicBoolean
  • AtomicInteger
  • AtomicIntegerArray
  • AtomicIntegerFieldUpdater
  • AtomicLong
  • AtomicLongArray
  • AtomicLongFieldUpdater
  • AtomicReference

下面将用代码来展示上面部分类的操作,基本操作都是相通的。

AtomicInteger类是一个实现原子操作的Integer类,常用的函数有:

  • getAndIncrement():完成 i++操作
  • IncrementAndget():完成 ++i操作
  • AddAndget(int i) :完成 value+i操作

AtomicintegerArray类是一个实现原子操作的整形数组类,提供了两种构造函数:AtomicIntegerArray(int length)和AtomicIntegerArray(int[] array),其常用的函数和AtomicInteger类相似。

  • addAndGet(int i, int delta):对index为i的数组元素加delta

AtomicReference类为实现原子操作的引用类。

AtomicIntegerFieldUpdater类是一个对类内的Integer变量操作的类。其构造函数为:

AtomicIntegerFieldUpdater<U> newUpdater(Class<U> tclass,String fieldName)

其中tclass是被操作的类,fieldName为类内的变量名,下面给出了使用方式,old变量需要加上public和volatile关键字修饰。

AtomicIntegerFieldUpdater<User> old =  AtomicIntegerFieldUpdater.newUpdater(User.class, "old");

package com.concur.dlutzy;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicIntegerArray;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
import java.util.concurrent.atomic.AtomicReference;

class User{
	public volatile int old;

	public int getOld() {
		return old;
	}

	public void setOld(int old) {
		this.old = old;
	}
}
public class Sequence {
	
	private AtomicInteger value  = new AtomicInteger(0);
	
	private int [] s = {2,1,4,6}; 
	
	AtomicIntegerArray a = new AtomicIntegerArray(s);
	
	
	AtomicReference<User> user = new AtomicReference<>();
	
	AtomicIntegerFieldUpdater<User> old =  AtomicIntegerFieldUpdater.newUpdater(User.class, "old");
	
	/**
	 * @return
	 */
	public  int getNext() {
		//为s数组的第一个元素加10
		a.addAndGet(0, 10);
		//为s数组的第三个元素+1
		a.getAndIncrement(2);
		System.out.println(a.toString());
		
		User user = new User();
		//为old++
		System.out.println(old.incrementAndGet(user));
		System.out.println(old.incrementAndGet(user));
						

		return value.incrementAndGet();
	}
	
	public static void main(String[] args) {
		
		Sequence s = new Sequence();
		
		new Thread(new Runnable() {
			
			@Override
			public void run() {
//				while(true) {
					System.out.println(Thread.currentThread().getName() + " " + s.getNext());
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
//				}
//					System.out.println("----------------");
				}
			}
		}).start();				
	}
}

输出结果为

[12, 1, 5, 6]
1
2
Thread-0 1

阅读更多
个人分类: 多线程笔记
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭