静态变量的并发问题

狼与自由 2017-02-17 03:29:48
在网上看到一段代码,如下:
public class Counter {
public static int count = 0;
public static void inc() {

//这里延迟1毫秒,使得结果明显
try {
Thread.sleep(1);
} catch (InterruptedException e) {
}
count++;
}

public static void main(String[] args) {

//同时启动1000个线程,去进行i++计算,看看实际结果
for (int i = 0; i < 1000; i++) {
new Thread(new Runnable() {
public void run() {
inc();
}
}).start();
}

//这里每次运行的值都有可能不同,可能为1000
System.out.println("运行结果:Counter.count=" + Counter.count);
}
}


启动1000的线程,每个线程对变量+1 ,结果应该是1000 才对,但是因为 并发的问题不能实现。
谁能修改下代码,让它运行正确。
...全文
525 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
狼与自由 2017-07-11
  • 打赏
  • 举报
回复 1
public static int count = 0; 改成 AtomicInteger = 0
zijiren2010 2017-02-17
  • 打赏
  • 举报
回复

        。。。。。。
        //这里每次运行的值都有可能不同,可能为1000
        System.out.println("运行结果:Counter.count=" + Counter.count);
        。。。。。。
什么都不说,单是多线程去修改值,你这里直接做输出就不对。 因为当循环结束,主线程开始进行打印操作的时候,启动的子线程并未全部运行结束(或者说不一定结束), 在这种情况下输出的结果就不确定
liny_ 2017-02-17
  • 打赏
  • 举报
回复
inc方法加个synchronized修饰 for循环结束后停个一两秒应该就可以得到1000了 public class Counter { public static int count = 0; public synchronized static void inc() { //这里延迟1毫秒,使得结果明显 try { Thread.sleep(1); } catch (InterruptedException e) { } count++; } public static void main(String[] args) { //同时启动1000个线程,去进行i++计算,看看实际结果 for (int i = 0; i < 1000; i++) { new Thread(new Runnable() { public void run() { inc(); } }).start(); } try { Thread.sleep(2000); } catch (InterruptedException e) { } //这里每次运行的值都有可能不同,可能为1000 System.out.println("运行结果:Counter.count=" + Counter.count); } }

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧