首页 > 编程知识 正文

intel汇编语言程序设计,java程序设计精编教程

时间:2023-05-05 19:48:39 阅读:50705 作者:92

一.自动积分器介绍

我认为原子积分器是在原子框架中使用最多的原子类。 pldsp,AtomicInteger是Integer类型的线程安全原子类,可以在APP应用程序中将int值更新为原子。

创建自动集成器对象

首先,让我们来看看如何创建自动集成器对象。

AtomicInteger提供了两个构造函数,如果使用默认构造函数,则内部int类型的值为0。

atomicintegeratomicint=newatomicinteger (;

AtomicInteger类内部并不复杂。 所有操作都是对内部int值——value执行的,Unsafe类提供线程安全的CAS操作。

2 .使用自动整合器

看看下面的示例程序。

公共类主{

publicstaticvoidmain (字符串[ ] args ) throws InterruptedException { )。

atomicintegerai=newatomicinteger (;

列表列表=new ArrayList (;

for(intI=0; i 10; I ) {

threadt=new thread (newaccumlator (ai )、' thread-' i );

list.add(t;

t.start (;

}

for(threadt:list ) {

t.join (;

}

system.out.println(AI.get ) );

}

staticclassaccumlatorimplementsrunnable {

隐私自动集成器Ai;

加速器(atomicintegerai ) {

this.ai=ai;

}

@Override

公共void run (}

for(intI=0,len=1000; i len; I ) {

ai.incrementAndGet (;

}

}

}

}

上面的代码使用AtomicInteger的incrementAndGet方法,在原子操作中自动增加int值。 该段程序的最终运行结果为10000(10个线程,每个线程比AtomicInteger增加1000 ),如果不使用AtomicInteger,则使用原始int

看看incrementAndGet的内部。

内部调用Unsafe类的getAndAddInt方法,将value的值原子增加1,并返回增加前的原始值。

请注意,以上是JDK1.8的实现。 在JDK1.8之前,上述方法采用自旋CAS操作方式。

公共final int getandincrement (

for (; () )。

int current=get (;

int next=current 1;

if (比较集(当前,下一步) )

返回当前;

}

}

3 .自动集成器特殊方法的说明

AtomicInteger有一种比较特殊的方法: ——lazySet。

lazySet方法是set方法的不可见版本。 什么意思?

我们知道用volatile限定的变量可以确保多处理器环境中的“可见性”。 这意味着,当一个线程更改共享变量时,其他线程可以立即读取该更改的值。 volatile实现最终添加了内存屏障:

写入volatile变量可确保CPU写入缓冲区中的数据被强制刷新到内存中

读取volatile变量时,禁用缓存,强制从内存读取最新值

由于内存屏障的存在,volatile变量也可以避免重新排序

lazySet在内部调用Unsafe类的putOrderedInt方法,此方法对共享变量的值的更改不一定在其他线程中立即可见。 也就是说,用普通变量的操作方法写变量。

为什么会有这样奇怪的方法? 在什么情况下需要使用lazySet?

请考虑以下场景。

priva

te AtomicInteger ai = new AtomicInteger();

lock.lock();

try

{

// ai.set(1);

}

finally

{

lock.unlock();

}

由于锁的存在:

lock()方法获取锁时,和volatile变量的读操作一样,会强制使CPU缓存失效,强制从内存读取变量。

unlock()方法释放锁时,和volatile变量的写操作一样,会强制刷新CPU写缓冲区,把缓存数据写到主内存

所以,上述ai.set(1)可以用ai.lazySet(1)方法替换:

由锁来保证共享变量的可见性,以设置普通变量的方式来修改共享变量,减少不必要的内存屏障,从而提高程序执行的效率。

二、类/接口说明

类声明

构造器

接口声明

方法声明

描述

int accumulateAndGet(int x, IntBinaryOperator accumulatorFunction)

使用IntBinaryOperator 对当前值和x进行计算,并更新当前值,返回计算后的新值

int addAndGet(int delta)

以原子方式将给定值与当前值相加,返回相加后的新值

boolean compareAndSet(int expect, int update)

如果当前值 == expect,则以原子方式将该值设置为给定的更新值(update)

int decrementAndGet()

以原子方式将当前值减 1,返回新值

int get()

获取当前值

int getAndAccumulate(int x, IntBinaryOperator accumulatorFunction)

使用IntBinaryOperator 对当前值和x进行计算,并更新当前值,返回计算前的旧值

int getAndAdd(int delta)

以原子方式将给定值与当前值相加,返回旧值

int getAndDecrement()

以原子方式将当前值减 1,返回旧值

int getAndIncrement()

以原子方式将当前值加 1,返回旧值

int getAndSet(int newValue)

以原子方式设置为给定值,并返回旧值

int getAndUpdate(IntUnaryOperator updateFunction)

使用IntBinaryOperator 对当前值进行计算,并更新当前值,返回计算前的旧值

int incrementAndGet()

以原子方式将当前值加 1,返回新值

void lazySet(int newValue)

设置为给定值,但不保证值的改变被其他线程立即看到

void set(int newValue)

设置为给定值

int updateAndGet(IntUnaryOperator updateFunction)

使用IntBinaryOperator 对当前值进行计算,并更新当前值,返回计算后的新值

boolean weakCompareAndSet(int expect, int update)

weakCompareAndSet无法保证除操作目标外的其他变量的执行顺序( 编译器和处理器为了优化程序性能而对指令序列进行重新排序 ),同时也无法保证这些变量的可见性。

三、其它原子类

与AtomicInteger类似的原子类还有AtomicBoolean和AtomicLong,底层都是通过Unsafe类做CAS操作,来原子的更新状态值。可以参考Oracle官方文档:https://docs.oracle.com/javas...,不再赘述。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。