广州做企业网站,天津建设工程信息网吧,上海网站开发网站开发公司,服装加工厂怎么找客户一、ABA问题的解决方案
变量第一次读取的值是1#xff0c;后来其他线程改成了3#xff0c;然后又被其他线程修改成了1#xff0c;原来期望的值是第一个1才会设置新值#xff0c;第二个1跟期望不符合#xff0c;但是#xff0c;可以设置新值。
解决方案#xff1a;
后来其他线程改成了3然后又被其他线程修改成了1原来期望的值是第一个1才会设置新值第二个1跟期望不符合但是可以设置新值。
解决方案
a增加一个自定义的版本号变量记录修改日志每次修改一次就加1 。当值相同时还要比较版本号如果版本号也一样才能更新成新的值。 b采用原子引用类 AtomicStampedReference通过控制变量值的版本号来确保CAS的正确性比较两个值引用是否一致只有一致才会更新成新值。 二、无限循环问题自旋的解决方案
底层使用一个while循环来实现的所以Atomic类设置值进入一个无限循环只要失败了就不停的循环再次疯狂的尝试。高并发场景下多个线程频繁修改同一个值则会导致大量线程执行compareAndSet的方法时要循环 n 次才能更新成功就是大量线程执行一个重复的空循环自旋锁造成系统的大量开销。
解决方案
a采用 jdk 8 中的 LongAdder分段CAS 自动分段迁移。 三、多原子的变量问题的解决方案
一般的Atomic类只能保证一个共享变量的原子性。
解决方案
a采用 java 并发包的 AtomicReference这个是封装自定义对象的多个变量可放一个自定义对象中然后它会检查该对象的引用是否是相同。如果多个线程同时对一个对象变量的引用进行修改AtomicReference 的 CAS 算法可解决并发冲突问题。