java 线程 原子类相关操作示例 thinking in java4 目录21.3.4

java 线程  原子类相关操作示例

package org.rui.thread.volatiles;

import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
/**
 * 原子类,
 * java SE5引入了诸如AtomicInteger AtomicLong AtomicReference
 * 等特殊的原子性变量类,它们提供下面形式的原子性条件更新操作:
 * 
 * boolean compareAndSet(expectedValue,updateValue);
 * 
 * 这些类被调整为可以使用在某些现代处理器上的可获得的,并且是在机器级别上的原子性,
 * 因此在使用它们时,通常不需要担心。对于常规编程来说,它们很少会派上用场,但是在涉级性能调优时,
 * 它们就大有用武之地了,例如,我们可以使用AtomicInteger来重写AtomictyTest.java
 * @author lenovo
 *
 */
public class AtomicIntegerTest implements Runnable {
/**
 * 这里我们通过使用AtomicInteger而消除了synchronized关键字。
 * 因为这个程序不会失败,所以添加了一个timer,以便在5秒钟之后自动地终止
 */
	private AtomicInteger i=new AtomicInteger(0);
	public int getValue(){return i.get();}
	private void evenIncrement(){i.addAndGet(2);}
	@Override
	public void run() 
	{
		while(true)
		{
			evenIncrement();
		}
	}

	public static void main(String[] args) 
	{
		//订时器
		new Timer().schedule(new TimerTask() 
		{
			@Override
			public void run() 
			{
				System.err.println("Aborting");
				System.exit(0);
			}
		}, 5000);
		//线程池
		ExecutorService exec=Executors.newCachedThreadPool();
		AtomicIntegerTest at=new AtomicIntegerTest();
		exec.execute(at);
		while(true)
		{
			int val=at.getValue();
			if(val%2!=0)
			{
				System.out.println(val);
				System.exit(0);
			}
		}

	}
}
/**
 * output:
 * Aborting
 */

package org.rui.thread.volatiles;

import java.util.concurrent.atomic.AtomicInteger;

import org.rui.thread.res.EvenChecker;
import org.rui.thread.res.IntGenerator;
/**
 * 下面是用AtomicInteger重写MutexEvenGenerator.java:
 * 所有其他形式的同步再次通过使用AtomicInteger得到了根除
 * 
 * 
 * 
 * 应该强调的是,atomic类被设计用来构建java.util.concureent中的类,
 * 因此只有在特殊情况下才在自己的代码中使用它们,即便使用了也需要确保不存在其他可能出现的问题。
 * 通常依赖于锁要更安全一些(要么是synchronized关键字,要么是显式的lock对象)
 * @author lenovo
 *
 */
public class AtomicEvenGenerator extends IntGenerator{

	private AtomicInteger currentEvenValue=new AtomicInteger(0);
	
	@Override
	public int next() {
		return currentEvenValue.addAndGet(2);
	}
	public static void main(String[] args) {
		EvenChecker.test(new AtomicEvenGenerator());
	}

}


你可能感兴趣的:(编程,线程,性能,线程池,安全)