Multithreading Java线程问题
下面的代码不应该打印出正确的余额(100),但它每次都为我打印出100。为什么呢?以下代码似乎不是线程安全的Multithreading Java线程问题,multithreading,Multithreading,下面的代码不应该打印出正确的余额(100),但它每次都为我打印出100。为什么呢?以下代码似乎不是线程安全的 public class ThreadObject implements Runnable{ private int balance; public ThreadObject() { super(); } public void add() { int i = balance; balance = i
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();
}
}
公共类ThreadObject实现可运行{
私人国际收支平衡;
公共线程对象(){
超级();
}
公共无效添加(){
int i=平衡;
余额=i+1;
}
public void run(){
对于(int i=0;i而言,println
可能比更新余额的代码慢数千倍。每个线程几乎花费所有时间打印,因此它们同时更新余额的可能性非常小
在读i
和写i+1
之间增加一点睡眠时间
这里有一个卑鄙的问题:运行上述代码后,i
的最小可能值是多少?将您的println向上移动一点,以确定这不是线程安全的。如果您仍然看不到任何更改,请再大50(比如5000或更多)
public void add(){
int i=平衡;
系统输出打印项次(“余额为”+余额);
余额=i+1;
}
public void run(){
对于(int i=0;iis最小值50?因为我能想到的最坏情况是T1进入睡眠,T2接管并更新i,T1唤醒并更新平衡,T2唤醒并更新平衡…并以这种模式继续。或者还有比这更糟的情况吗?我似乎不明白。你能解释一下吗?
public void add() {
int i = balance;
System.out.println("balance is " + balance);
balance = i + 1;
}
public void run() {
for(int i=0;i<50;i++) {
add();
}
}