西安公司建设网站,含山县建设局网站下载,响应式网站和,携程网网站是哪家公司做的AtomicInteger#xff0c;一个提供原子操作的Integer的类。在Java语言中#xff0c;i和i操作并不是线程安全的#xff0c;在使用的时候#xff0c;不可避免的会用到synchronized关键字。而AtomicInteger则通过一种线程安全的加减操作接口。来看AtomicInteger提供的接口。//…AtomicInteger一个提供原子操作的Integer的类。在Java语言中i和i操作并不是线程安全的在使用的时候不可避免的会用到synchronized关键字。而AtomicInteger则通过一种线程安全的加减操作接口。来看AtomicInteger提供的接口。//获取当前的值public final int get()//取当前的值并设置新的值public final int getAndSet(int newValue)//获取当前的值并自增public final int getAndIncrement()//获取当前的值并自减public final int getAndDecrement()//获取当前的值并加上预期的值public final int getAndAdd(int delta)... ...为什么说atomicInteger是线程安全的呢在AtomicInteger的源码中相关的代码如下Java代码 // setup to use Unsafe.compareAndSwapInt for updatesprivate static final Unsafe unsafe Unsafe.getUnsafe();上面这行代码是获取Unsafe实例的。一般情况下我们是拿不到该类的实例的当然jdk库里面是可以随意使用的。Java代码 static {try {valueOffset unsafe.objectFieldOffset(AtomicInteger.class.getDeclaredField(value));} catch (Exception ex) { throw new Error(ex); }}上面这几行代码是用来获取AtomicInteger实例中的value属性在内存中的位置。这里使用了Unsafe的objectFieldOffset方法。这个方法是一个本地方法 该方法用来获取一个给定的静态属性的位置。Java代码 public native long objectFieldOffset(Field f);这里有个疑问为什么需要获取属性在内存中的位置通过查看AtomicInteger源码发现在这样几个地方使用到了这个valueOffset值Java代码 public final void lazySet(int newValue) {unsafe.putOrderedInt(this, valueOffset, newValue);}Java代码 public final boolean compareAndSet(int expect, int update) {return unsafe.compareAndSwapInt(this, valueOffset, expect, update);}Java代码 public final boolean weakCompareAndSet(int expect, int update) {return unsafe.compareAndSwapInt(this, valueOffset, expect, update);}查找资料后发现lazySet方法大多用在并发的数据结构中用于低级别的优化。compareAndSet这个方法多见于并发控制中简称CAS(Compare And Swap)意思是如果valueOffset位置包含的值与expect值相同则更新valueOffset位置的值为update并返回true否则不更新返回false。这里可以举个例子来说明compareAndSet的作用如支持并发的计数器在进行计数的时候首先读取当前的值假设值为a对当前值 1得到b但是1操作完以后并不能直接修改原值为b因为在进行1操作的过程中可能会有其它线程已经对原值进行了修改所以在更新之前需要判断原值是不是等于a如果不等于a说明有其它线程修改了需要重新读取原值进行操作如果等于a说明在1的操作过程中没有其它线程来修改值我们就可以放心的更新原值了。