- 时间:2022-07-08 02:11 编辑: 来源: 阅读:269
- 扫一扫,手机访问
摘要:Java-CAS的使用和描述
{企业网站源码}
Cascompare and swap,意思是比较和交换,是用java中的Unsafe类实现的。常见的CAS实现包括AtomicInteger、AtomicLong、AtomicReference等。,都是用乐观锁的形式来实现多线程编程。 下面以AtomicInteger为例进行详细说明:1 .原子整数的使用公共静态void main(string[]args){ atomic integer atomic integer = new atomic integer();int I = atomic integer . incrementandget();system . out . println(I);}2.通过源代码分析构造AtomicInteger时,默认创建一个不安全的对象,这是实现CAS的关键。 Value表示对象中字段的偏移量,以便可以通过偏移量直接索引字段值。 公共类AtomicInteger扩展Number实现Java . io . serializable { private static final long serial version uid = 6214790243416807050 l;//安装程序使用Unsafe.compareAndSwapInt进行更新private static final Unsafe Unsafe = Unsafe . get Unsafe();私有静态最终长值偏移量;static { try { value offset = unsafe . objectfield offset(atomic integer . class . getdeclaredfield(" value "));} catch(Exception ex){ throw new Error(ex);} }私有volatile int值;..}incrementAndGet方法public final int incrementAndGet(){ return unsafe . getandaddint(this,valueoffset,1)+1;}在执行incrementAndGet时,getAndAddInt将始终执行-while。var1和var2找到对象字段的位置,不断升级var5得到当前值。var5+var4将作为升级值,重复升级直到升级成功。 public final int getAndAddInt(Object var 1,long var2,int var 4){ int var 5;do { var 5 = this . getint volatile(var 1,var 2);} while(!this.compareAndSwapInt(var1,var2,var5,var 5+var 4));返回var5}最后一个原生方法compareandswapintpublic最后一个原生布尔compareandswapint (objectvar1,longvar2,intvar4,int var 5);3.引用AtomicInteger自行操作不安全类导入sun . misc . Unsafe;导入Java . lang . reflect . field;public class unsafestest { public static void main(String[]args)抛出异常{ Unsafe Unsafe = get Unsafe();long offset = unsafe . objectfield offset(entry . class . getdeclaredfield(" id "));system . out . println(" offset:"+offset);Entry entry =新条目();entry . setid(1);boolean b = unsafe . compareandswapint(entry,offset,1,2);system . out . println(b);system . out . println(entry . getid());}/* * *通过反射获取不安全实例*/public static unsafe get unsafe()抛出IllegalAccess异常,NosuchFieldException { field field field = Unsafe . class . getdeclaredfield(" the Unsafe ");field . set accessible(true);return(Unsafe)field . get(null);}公共静态类条目{ private int idpublic int getId(){ return id;} public void setId(int id){ this . id = id;} }}
![](http://bm.damiseo.cn/15914/www.php-asp.net/dami/0042684001648530707tp66-1.jpg)