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();
}
}
第一次累加会重复,如果加锁就是顺序输出基本都是一个线程干活了,是不是我代码第一次读写的有问题。。。
加锁你看到基本只是一个线程干活,是因为次数太少。提高到10000或者更多,就可以看到区别了
count++本身非线程安全,加锁(如上)或者使用
AtomicInteger
.补充一点,
使用volatile修饰并不能解决count++不是线程安全的问题。关于自增操作的线程安全性可以看这篇文章 ++操作的线程安全性及相关问题