3
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() 方法,程序的输出也会像我预期的那样出现?

4

2 回答 2

7

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

如果您希望它们相互覆盖(我假设这只是在玩耍),Thread请在ThreadSafe. 此外,将您的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;
于 2012-08-27T13:19:04.760 回答
0

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

于 2012-08-27T13:20:53.250 回答