加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 将volatile关键字与包装类一起使用

发布时间:2020-12-15 04:43:29 所属栏目:Java 来源:网络整理
导读:在 Java并发类中,我建议在多线程应用程序中使用以下代码作为计数器 private volatile int count; 我问自己是否可以将volatile关键字与包装类Integer一起使用而不是原始类型int(见下文): private volatile Integer count; 在这种情况下使用Integer包装类是否
在 Java并发类中,我建议在多线程应用程序中使用以下代码作为计数器

private volatile int count;

我问自己是否可以将volatile关键字与包装类Integer一起使用而不是原始类型int(见下文):

private volatile Integer count;

在这种情况下使用Integer包装类是否正确?

解决方法

严格来说,这是正确的.如果一个线程设置了新计数,则读取它的每个其他线程将获得新值.

如果两个线程同时写入值,则会遇到问题,因为从来没有保证上次为计数器读取的值是写入计数器时的值.例如,如果您有两个线程,并且计数器从0开始.

Thread 1: int temp = count.intValue(); //temp = 0;
Thread 2: int temp = count.intValue(); //temp = 0;
Thread 1: count = new Integer(temp+1); //count = 1;
Thread 2: count = new Integer(temp+1); //count = 1;

如您所见,您将计数器递增两次但值仅增加1.即使您将命令更改为,也会发生相同的行为

count =  new Integer(count.intValue() + 1);

由于JVM仍然需要读入值,递增并写出,每个都至少有1个周期.

要避免这种情况,请使用@chrylis建议的AtomicInteger(不需要易失性),或者使用同步和/或锁定来确保永远不会有2个线程写入计数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读