我需要通过多个线程更新全局BigInteger值 – BigInteger线程安全吗?
解决方法
BigInteger个对象是
immutable objects的代表性示例.
简而言之:
简而言之:
Each immutable object is thread-safe,but the reference to it
07002.
对于不可变对象,状态在整个生命周期内都是固定的.因为没有更改它的选项,因此每个“更改”操作等同于替换新对象.因此,在特定参考上的N个线程并行执行一系列修改后,结果值很难预测(某些更新可能会丢失 – 未被注意).
同样的故事是Integer课.为了克服这个限制,AtomicInteger课程被引入JDK5.
不幸的是,JDK中没有“AtomicBigInteger”类.另一种解决方案是用AtomicReference包装一个对象实例 – 它作为一个代理使所有操作同步和原子化.
final atomicreference<BigInteger> valueHolder = new atomicreference(BigInteger.ZERO);
使用这种方法,BigInteger提供的任何方法都可以重新表示为lambda表达式,例如:
valueHolder.updateAndGet(x -> x.add(BigInteger.valueOf(10)));
要检查解决方案是否正确,您可以使用此代码段,使用并行流汇总所有低于100的整数(它是多线程操作):
IntStream.range(0,100).parallel() .forEach(i -> valueHolder.updateAndGet(x -> x.add(BigInteger.valueOf(i))));
原文地址:https://www.jb51.cc/java/121727.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。