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个线程写入计数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |