为了账号安全,请及时绑定邮箱和手机立即绑定

java多线程累加 第一次累加出现重复

java多线程累加 第一次累加出现重复

噜噜哒 2019-01-17 03:51:46
import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Start implements Runnable { protected int count = 0; @Override public void run() { while (count < 100) { count++; System.out.println(Thread.currentThread().getName() + " count:" + count); } } public static void main(String[] args) { Runnable runnable = new Start(); ExecutorService executorService = Executors.newFixedThreadPool(10); for (int i = 0; i < 2; i++) { executorService.execute(runnable); } executorService.shutdown(); } } 第一次累加会重复,如果加锁就是顺序输出基本都是一个线程干活了,是不是我代码第一次读写的有问题。。。
查看完整描述

4 回答

?
交互式爱情

TA贡献1712条经验 获得超3个赞

加锁你看到基本只是一个线程干活,是因为次数太少。提高到10000或者更多,就可以看到区别了

while (count < 10000) {
    synchronized (this) {
        count++;
        System.out.println(Thread.currentThread().getName() + " count:" + count);
    }
}

count++本身非线程安全,加锁(如上)或者使用AtomicInteger.

补充一点,
使用volatile修饰并不能解决count++不是线程安全的问题。关于自增操作的线程安全性可以看这篇文章 ++操作的线程安全性及相关问题

查看完整回答
反对 回复 2019-02-12
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

  1. 多线程的实现有问题,为什么是同一个Runnable对象被提交三次,如果希望多个线程并发修改一个值,应该把count声明为静态的全局变量,并且新建多个Runnable任务来并发运行。
  2. count++不是原子性操作,肯定会出现问题。建议使用AtomicInteger类型来控制并发
查看完整回答
反对 回复 2019-02-12
?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

count非线程安全,参考原子操作类,或synchronized的用法

查看完整回答
反对 回复 2019-02-12
  • 4 回答
  • 0 关注
  • 1084 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信