• Tags
  •         
  • www.breakyizhan.com
  •    

    在Java的多线程中,synchronized关键字volatile关键字都能保证其原子性。但是呢,在JDK5之后呢,就提供了原子类来保证事务的原子性,主要的JDK5提供的原子类操作有

    • 原子类更新基本类型
    • 原子类更新数组
    • 原子类更新抽象类型
    • 原子类更新字段

    这篇文章主要举例说明原子类如何进行基本的原子性操作。

    JDK5原子类的路径位置

    JDK5原子类的位于rt.jar包底下的java.util.concurrent.atomic下面,如下:

    Java的并发编程:JDK5原子类的操作及其原理

    Java的并发编程:JDK5原子类的操作及其原理

    JDK5原子类更新基本类型

    Java的并发编程:线程的安全性问题的分析借鉴一个例子,来用原子类更新基本类型:

    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);
    	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() {
    		User user = new User();
    		System.out.println(old.getAndIncrement(user));
    		System.out.println(old.getAndIncrement(user));
    		System.out.println(old.getAndIncrement(user));
    
    		a.getAndIncrement(2);
    		a.getAndAdd(2, 10);
    		return value.getAndIncrement();
    	}
    	
    	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(100);
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    				}
    			}
    		}).start();
    		
    		new Thread(new Runnable() {
    			
    			@Override
    			public void run() {
    				while(true) {
    					System.out.println(Thread.currentThread().getName() + " " + s.getNext());
    					try {
    						Thread.sleep(100);
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    				}
    			}
    		}).start();
    		
    
    		
    	}
    
    }
    
      
    这里有一个use的类,如下:
    package com.roocon.thread.t8;
    
    public class User {
    
    	private String name;
    
    	public volatile int 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;
    	}
    
    }
    
    

    从上面的例子可以看出,主要的JDK5提供的原子类操作有

    • 原子类更新基本类型 (AtomicInteger)
    • 原子类更新数组 (AtomicIntegerArray)
    • 原子类更新抽象类型 (AtomicReference)
    • 原子类更新字段 (AtomicIntegerFieldUpdater)

     
    转载请保留页面地址:https://www.breakyizhan.com/java/6640.html