繁体   English   中英

多线程程序中的意外输出

[英]Unexpected output in multithreaded program

class ThreadSafe implements Runnable {
  int arr[]=new int[]{1,2,3,4,5};
  int sum=0;
  public void run() {
    int result=sum();
    System.out.println("for "+Thread.currentThread().getName()+"the value        is"+result);
  }

  public int sum() {
    for(int i=0;i<5;i++) {
      sum=sum+arr[i];
      System.out.println("calculating sum for      thread"+Thread.currentThread().getName()+"sum ="+sum);
      try {
        Thread.sleep(10);
      } catch(Exception e) {}
    }
    return sum;
  }

  public static void main(String...d) {
    ThreadSafe ts=new ThreadSafe();
    ThreadSafe ts1=new ThreadSafe();
    Thread t=new Thread(ts);
    Thread t1=new Thread(ts1);
    t1.start();
    t.start();
  }
}

我期待输出不会来15.因为sum方法不同步所以多一个线程可以同时执行sum方法

我期待的是因为2个线程会立即执行sum方法所以输出不应该是15,因为第一个线程会将sum的值更新为某个值,该值将被另一个线程读取。

所以我的问题是为什么即使我没有同步sum()方法,程序的输出也按照我期望的方式出现?

您正在创建两个ThreadSafe实例,每个实例都有自己的sum实例变量。

如果你想让它们互相覆盖(我假设这只是玩游戏),在同一个ThreadSafe实例上创建两个Thread 此外,将sum变量标记为volatile,以指示它可以被另一个线程更改(如果编译器检测到它未在方法中的其他位置更改,则避免对值进行内部缓存)。

例如,将main方法更改为:

public static void main(String...d) {
    ThreadSafe ts=new ThreadSafe();
    Thread t=new Thread(ts);
    Thread t1=new Thread(ts);
    t1.start();
    t.start();
  }

并且ThreadSafe类定义的开头是这样的:

class ThreadSafe implements Runnable {
  int arr[]=new int[]{1,2,3,4,5};
  volatile int sum=0;

因为有两个ThreadSafe实例由不同的线程处理。 为了产生您想要的结果,它应该像一个实例和多个线程在同一个实例上工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM