下面的代码不应该输出正确的余额(100),但它每次都打印出100次。这是为什么?下面的代码似乎不是线程安全的。Java线程问题
public class ThreadObject implements Runnable{
private int balance;
public ThreadObject() {
super();
}
public void add() {
int i = balance;
balance = i + 1;
}
public void run() {
for(int i=0;i<50;i++) {
add();
System.out.println("balance is " + balance);
}
}
}
public class ThreadMain {
public static void main(String[] args) {
ThreadObject to1 = new ThreadObject();
Thread t1 = new Thread(to1);
Thread t2 = new Thread(to1);
t1.start();
t2.start();
}
}
如果下面的代码确实是线程安全的,你能解释一下吗?
因为它看起来像add()中的代码根本不是线程安全的。一个线程可能会将i
设置为当前balance
,但随后在第二个线程接管并更新balance
时变为非活动状态。然后,线程1醒来,将balance
设置为过期的i
加1.
是最小值50吗? 因为我能想到的最糟糕的情况是T1会睡觉,T2会接管并更新我,T1会唤醒并更新平衡,T2会唤醒并更新平衡......并继续处于此模式。 还是有比这更糟的情况? – Glide 2010-12-16 10:51:51
@Glide:不,它少得多。 – 2010-12-16 11:59:13
我似乎无法弄清楚。你能解释一下吗? – Glide 2010-12-16 23:17:27