首页 > 编程知识 正文

atomicinteger原理,string类源码

时间:2023-05-05 06:56:47 阅读:146328 作者:2197

目录

1、原子布尔的基本用法

1.1、创建自动布尔

1.2、原子布尔值得更新

2、原子布尔内幕

3、为什么需要原子布尔

4、如何支持布尔类型

AtomicBoolean提供了原子读写布尔变量的解决方案,该类通常用于原子更新状态标识位,如flag。

1、原子布尔的基本用法原子布尔类比较简单,其内部实现原理与原子集成器相似

1.1、原子布尔的创立原子布尔也提供了一个有参无参两种结构方法。

//无参数构建方法的默认值为falseatomicbooleanflag=newatomicboolean (; //有参数构建方法,可以指定初始值atomicbooleanflag1=newatomicboolean (true ); 1.2、原子布尔比较compareAndSet(boolean expect, boolean update):值得设置布尔的最新值。 与AtomicInteger的compareAndSet方法类似,如果期望值与AtomicBoolean的当前值匹配,则执行新值的设置动作。 如果weakCompareAndSet(boolean expect, boolean update):同上。 33558 www.Sina.com/:设置atomic boolean的最新值。 此新值的更新将立即显示在其他线程上。 3358 www.Sina.com/:返回atomic boolean之前的布尔值,并设置新值。 publicclassatomicbooleanexample { publicstaticvoidmain (string [ ] args ) atomicbooleanflag=newatomicboolean ); booleanandset=flag.getan dset (true; System.out.println ('原始值: ' andSet ); System.out.println ('当前值: ' flag.get ) ); }2、AtomicBoolean内幕AtomicBoolean的实现方法与AtomicInteger类相似,实际上AtomicBoolean内部的value本身就是用volatile关键字修饰的int型成员属性。

//setuptouseunsafe.compareandswapintforupdatesprivatestaticfinalunsafeunsafe=unsafe.get unsafe (专用测试功能登录) static { try } value offset=unsafe.objectfieldoffset (atomic boolean.class.getdeclaredfield (' value ' ) ); }catch(exceptionex ) thrownewerror ) ex; }//volatile关键字限定的value值专用volatile int value; 3、为什么需要AtomicBoolean?对于int或long型变量,由于需要加减操作,所以需要进行锁定。但是,对于boolean型,只要进行true或false的赋值和值操作,加上volatile关键字就足够了。 为什么需要自动布尔呢?

可能有以下情况。

布尔标志=假; if(flag==false ) { flag=true; ……也就是说,实现compare和set这两个操作相结合的原子性,这正是CAS提供的功能。 上面的代码如下所示

在if(flag.compareandset(false,true ) )/todo ) 4、布尔型支持方法Unsafe类中,CAS操作仅提供三种类型: int、long、Object (引用)

publicfinalnativebooleancompareandswapobject (objectvar 1、long var2、Object var4、Object var5); publicfinalnativebooleancompareandswapint (objectvar 1、long var2、int var4、int var5); publicfinalnativebooleancompareandswaplong (objectvar 1、long var2、long var4、long var6);set(boolean newValue)

用int型代替时,参加时将布尔型转换为int型; 返回值时,将int类型转换为布尔类型。 如下所示。

获取布尔值实际上就是比较当前值是否为0 public final boolean get () { return value!=0; 设置boolean的值实际上会转换为1或0 publicfinalbooleancompareandset (boolean expect,boolean update ) ({ int e=expect? 1 : 0; int u=update? 1 : 0; return unsafe.compareandswapint (this,valueOffset,e,u ); }

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