chenzhichao 2015-08-03 16:30 采纳率: 50%
浏览 4117
已采纳

java多线程操作同一个变量的问题,难道是多核cpu所致?

大家请看代码和输出结果,我百思不得其解,为什么 amount只加了一次,开始我以为是static所致,就算去掉也还是有几率出现这样的结果,难道是多核cpu真的把两个线程同时执行了?图片说明

package study;

public class MyRunnable implements Runnable {

    public static int  amount=0;
    @Override
    public void run() {
        // TODO 自动生成的方法存根
        amount++;
        String s=Thread.currentThread().getName();
        System.out.println(s+"  "+amount);
    }
}
package study;

public class MyFirstThread {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
         MyRunnable r1=new MyRunnable();
     Thread AThread=new Thread(r1);
     Thread BThread=new Thread(r1);
     AThread.start();
     BThread.start();

  for(;;)
  {
      if((!AThread.isAlive())&&(!BThread.isAlive()))
      {
        System.out.println("amount ="+r1.amount); 
        break;
      }
  }

    }
}

  • 写回答

6条回答 默认 最新

  • danielinbiti 2015-08-03 16:36
    关注

    没有加同步锁的问题,两个线程是同时执行的,amount什么值都有可能,可能都是1,可能打印都是2,也可能打印2,1。所以需要对amount加同步锁

     public static Integer  amount=0;
        @Override
        public void run() {
            // TODO 自动生成的方法存根
            synchronized(amount){
                amount++;
                String s=Thread.currentThread().getName();
                System.out.println(s+"  "+amount);
            }
        }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序
  • ¥15 onvif+openssl,vs2022编译openssl64
  • ¥15 iOS 自定义输入法-第三方输入法
  • ¥15 很想要一个很好的答案或提示