首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java Concurrent Programming (五)

2012-08-26 
Java Concurrent Programming (5)5 原子变量java.util.concurrent.atomic包中添加原子变量类。所有原子变量

Java Concurrent Programming (5)
5 原子变量
  java.util.concurrent.atomic包中添加原子变量类。所有原子变量都公开"比较并设置"原语,这些原语都是使用平台上可用的最快本机结构来实现的。原子变量类可以认为是volatile变量的泛化,它扩展了volatile变量的概念,来支持原子条件的比较并设置更新。读取和写入原子变量与读取和写入对volatile变量的访问具有相同的存取语义。concurrent.atomic包中原子变量类共12个,分成4组:计量器,域更新器,数组以及符合变量。最常用的原子变量是计量器:AtomicInteger,AtomicLong,AtomicBoolean以及AtomicReference。这四个class都提供两个constructor, 默认无参和指定参数。默认的constructor的值为零,false或null,依据数据类型初始化对象。他们的set与get方法以atomic的设定与取得值。getAndSet方法能够在返回初始值的时候atomic化的设定变量成新的值。addAndGet与getAndAdd方法提供“前置”与“后”的运算符给指定值的加法运算,这两个method让程序能够对变量增或减一个指定值,包括负值。incrementAndGet,decrementAndGet,getAndIncrement,getAndDecrement方法,提供了前置递增,前置递减,后递增,后递减的功能。compareAndSet和weakCompareAndSet方法,提供了有条件修改程序的方法。这两个method有两个参数,在method启动时预期数据所具有的值,以及要把数据所设定成的值。method只会在变量具有预期值的时候才会将它设置成新值。如果当前值不等于预期值,该变量不会被重新赋值,其method返回false。如果当前值等于预期值会返回true,并且此时值会被设定成新值。这个method的week形式基本也是一样的,区别在于,week形式少了一项保证:如果method放回的是false,该变量不会被变动,但是这并不代表现有值不是预期值。这个method不管初始值是否为预期值都可能会无法更新该值。此外,AtomicInteger和AtomicLong还支持从Integer到int,float,double的转化输出。
  以下是使用的一个小例子:


5.1 线程池
  Executor为所有线程池的父接口。
  ExecutorService接口继承自Executor接口,增加了一些池的管理功能,以及可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。其实现类为AbstractExecutorService,其实现了submit和doInvokeAny重载版本的方法,AbstractExecutorService为一个抽象类,而我们经常用到的ThreadPoolExecutor就是继承自AbstractExecutorService,ThreadPoolExecutor实现了其他所有AbstractExecutorService未实现的方法。
  ScheduledExecutorService接口继承自ExecutorService,增加了一些可安排在给定的延迟后运行或定期执行命令的方法。其实现类为ScheduledThreadPoolExecutor,ScheduledThreadPoolExecutor继承自ThreadPoolExecutor并实现了ScheduledExecutorService,它可另行安排在给定的延迟后运行命令,或者定期执行命令,ScheduledThreadPoolExecutor中含有了所有的方法。
  Executors为一个工厂类,提供了很多的方法,包括创建ExecutorService,ScheduledExecutorService,ThreadFactory,Callable。
  Callable接口类似与Runnable接口,有相同的功能,只不过Callable提供的call方法有返回值,而Runnable的run方法无返回值。

5.2 ThreadLocal变量
  ThreadLocal是Thread的局部变量,其为每个使用该变量的线程提供独立的变量副本。所以每一个线程都可以独立的改变自己的副本,而不会影响其他线程所对应的副本。从线程的角度看,目标变量就是线程的本地变量,这也是类名中"Local"所要表达的意思。
  ThreadLocal被定义为:
查看更多 下一篇
热点排行