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()方法,程序的输出也按照我预期的方式出现?
答案 0 :(得分: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;
答案 1 :(得分:0)
因为有两个ThreadSafe
实例由不同的线程处理。为了产生您想要的结果,它应该像一个实例和多个线程在同一个实例上工作