首页 > 编程知识 正文

integer的原生类型,atomicinteger线程安全

时间:2023-05-06 04:26:26 阅读:50703 作者:2018

文章目录一、为什么引入了自动集成器? 二、自动积分器原理分析1 .具体使用2 .原理分析3、简要说明

一、为什么引入了自动集成器?

说到线程安全,首先您会想到同步和锁定,但这种方法被命名为独占锁,一次只能包含一个具有锁的线程。 此外,还有不同线程争锁的机制,由于效率低下,悲观锁

对此,有乐观锁的概念。 在不锁定的情况下完成操作,如果碰撞失败,则重试直到成功。

由于AtomicInteger使用乐观锁定来确保线程安全,因此相对于悲观锁定更有效率。

如果多个线程同时使用CAS处理一个变量,则只有一个线程获胜并更新成功,其馀线程失败。 失败的线程不会挂起,仅通知失败,并允许重试。 当然,也允许失败的线程放弃操作

二、AtomicInteger原理分析1 .具体来说,如果我们想实现一个功能来统计网页的访问量,可以使用count来统计访问量,但这个自增操作并不是线程安全的。

加锁实现:

class counter { privatevolatileintcount=0; publicsynchronizedvoidincrement ({ count; }公共int getcount () { return count; }} AtomicInteger 实现:

使用classcounter//atomicinteger,无需锁定即可实现线程安全。 privateatomicintegercount=newatomicinteger (; 公共语音增量((count.incrementandget ) ); } public int getCount () { return count.get ); }2.原理分析AtomicInteger 类中定义的属性:

//setuptouseunsafe.compareandswapintforupdatesprivatestaticfinalunsafeunsafe=unsafe.get unsafe (专用测试功能登录) satic { try } value offset=unsafe.objectfieldoffset (atomic integer.class.getdeclaredfield (' value ' ) ); }catch(exceptionex ) thrownewerror ) ex; } } Unsafe是JDK内部的工具类,主要实现平台相关操作

sun.misc.Unsafe是用于JDK内部的工具类。 通过在Java层的代码中公开Java意义上的“不安全”功能,JDK可以使用Java代码实现更多原本依赖平台、需要使用c和c等native语言才能实现的功能请勿在JDK核心类库以外使用此类。

简单来说,此代码用于获取堆内存中value的偏移

Value的定义:

私有电压输入值; volatile的主要特性有两个。 防止排序; 实现内存可视性

内存可见性的作用是:当一个线程更改共享变量时,另一个线程读取该更改的值

用CAS操作实现原子性:

自动整合器有很多方法。 例如

incrementAndGet ()为I;

getAndAdd (相当于i=n。

从源代码中可以看到,这些方法的实现非常相似。 这里主要分析incrementAndGet ()方法的源代码

公共final int incrementandget () { for; ({ int current=get ); int next=current 1; if (比较性(当前,下一步) )返回下一步; } publicfinalbooleancompareandset (int expect,int update ) returnunsafe.compareandswapint ) this,valueOffset,expect } int

实现的中心是首先获取当前值和目标值,即current 1,并在compareandset(current,next )成功时返回目标值。

比较器执行CAS操作

每次基于“内存偏移”(valueOffset )从内存中检索数据时,将检索到的值与expect进行比较,如果数据匹配,则将内存中的值更改为update,如果数据不匹配,则表示内存中的数据已更新,等等

这样,使用CAS的方法保证原子操作

Java中的 AtomicLong、AtomicBoolean 等方法的基本原理和思想跟AtomicInteger基本相同

三.(1)用volatile关键字修饰 value 字段,保证了 value 字段对各个线程的可见性,各线程读取value字段时,会先从主从把数据同步到工作内存中,这样保证可见性

(2)Unsafe 实现操作原子性,用户在使用时无需增加额外的同步操作,compareAndSetInt方法是一个CAS操作,用native关键字修饰

原理:比较内存中的值是否与expected匹配,在匹配的前提下给出新的值x。 如果是,则返回true,如果不匹配,则返回false

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