我的java代码的方法不应该由两个线程同时执行。
package runnableThread;
public class CompteEnBanque {
private int solde = 100;
public int getSolde(){
if(this.solde < 0)
System.out.println(solde);
return this.solde;
}
public synchronized void retraitArgent(int retrait){
solde = solde - retrait;
System.out.println("Solde = " + solde);
}
}
package runnableThread;
public class RunImpl implements Runnable {
private CompteEnBanque cb;
private String name;
public RunImpl(CompteEnBanque cb, String name){
this.cb = cb;
this.name = name;
}
public void run() {
for(int i = 0; i < 50; i++){
if(cb.getSolde() >= 2){
cb.retraitArgent(2);
System.out.println("Retrait effectué par " + this.name);
}
}
}
}
这是我的主要()
package runnableThread;
public class Test {
public static void main(String[] args) {
CompteEnBanque cb = new CompteEnBanque();
Thread t = new Thread(new RunImpl(cb, "marie"));
Thread t2 = new Thread(new RunImpl(cb, "philippe"));
t.start();
t2.start();
}
}
通常,余额(我的源代码中的solde)永远不应该是负数,但是,当我执行此代码时,我得到负值。我不明白同步是否运作良好。
这里有一些输出
Retrait effectué par marie
Solde = 0
Retrait effectué par marie
Solde = -2
Retrait effectué par philippe
-2
答案 0 :(得分:0)
您正在读取同步块之外的solde值。
要阅读正确的值,您需要更新才能在&#34;之前发生。阅读它。只有当write和read都是在同一个对象上同步的内部块时,才能保证这一点。
同样在Run中,if语句周围没有同步,因此solde可能在检查值为&gt; = 2和递减值之间发生了变化。