Java5线程并发库之保障变量的原子性操作

java.util.concurrent.atomic

首先我们看java.util.concurrent.atomic包,它主要是提供一些为各种数据类型变量提供原子性操作的类。

AtomicInteger

比如我们来看AtomicInteger类,大家在写程序的时候经常要对整数加,加完了再把它取出来,有可能发生这个线程加完了,值还没取出来的时候,另一个线程又进去把值增加了,当别人增加完了,你再取出来的数据就不是你所期望的数据了。那么现在,如果我们用AtomicInteger这个类呢,就可以解决这个多线程访问整数的问题。看构造方法AtomicInteger(int initialValue),我们首先用这个类new一个对象,把我们的初始值给传递进去,当我们的线程想对他去进行增加的时候,我们可以调用这个对象身上的int addAndGet(int delta)方法,把我们要增加的值作为参数传递进去,它就可以返回相加的结果。如果这个过程当中有另一条线程也调用这个方法要加另外一个值,那个线程是加不进来的。必须是当前线程加完了,结果返回了以后,另一个线程才能去操作。它不会打断你。这就自动实现了线程同步,不需要我们使用者去考虑线程安全的问题。而int decrementAndGet()这个方法是调用一次减一个,int incrementAndGet()方法是调用一次加一个,如果是要一次减掉一个指定的数,还是使用int addAndGet(int delta)方法,传递一个负数作为参数就可以了。这就是对整数的一个原子性操作,对整数进行操作的时候能够对其他的线程进行排斥。用这个类就方便了我们,如果是多个线程访问同一个整数的情况下一定要用这个类。那同理,AtomicBoolean,AtomicLong也是一样的情况,只是操作的数据类型不同而已。

AtomicIntegerArray

接下来我们来看AtomicIntegerArray这个类,还是操作整数,对整数进行加呀,减呀。只是这时候它是从数组里面提出的一个整数。我们来看它的int addAndGet(int i, int delta)方法,把数组里面的第几个单元格里面的数字加几,或者减几,然后把计算得到的结果返回。这是专门操作数组里面的某个整数的。上面的类操作的是一个整数变量,这个类操作的是一个数组变量里面的某个整数。

AtomicIntegerFieldUpdater

接下来我们来看AtomicIntegerFieldUpdater这个类,当一个整数型变量放在一个类里面,作为类的字段成员,那么我现在要操作这个类里面的这个整数,或者说要操作这个类的对象里面的那个整数实例变量,那么我们就用AtomicIntegerFieldUpdater这个类,它里面提供了方法,首先我们来看static <U> AtomicIntegerFieldUpdater<U>  newUpdater(Class<U> tclass, String fieldName)这个静态方法,指定为哪个类身上的哪个字段创建一个AtomicIntegerFieldUpdater更新器对象,得到这个更新器对象以后,我们再看,int addAndGet(T obj, int delta)这个方法,为已经绑定了类和字段的更新器指定要更新的对象,和要加减的值,返回计算后的结果。这个是用反射来实现的,首先是哪个类身上哪个变量,这个更新器是专门对哪个类身上哪个变量操作的,那实际上,我们要操作变量的时候,变量是位于一个个的对象当中,同一个类可能创建了20个对象,那么现在我们要操作的整数变量到底是操作这20个对象当中的哪个对象身上的整数呢,所以我们要指定这个对象,那我现在到底是操作这个对象身上的哪个字段呢?在我们获得这个更新器对象的时候就已经指定好了类和字段.这个跟反射很相似,反射操作成员变量的时候,也是先搞类和字段,然后得到Filed对象,然后再拿到某一个具体的对象身上去操作。

猜你喜欢

转载自my.oschina.net/u/3512041/blog/1822026