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

發佈了51 篇原創文章 · 獲贊 23 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章