同步方法无法按预期工作

时间:2018-05-23 11:43:06

标签: java multithreading synchronized

我的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

1 个答案:

答案 0 :(得分:0)

您正在读取同步块之外的solde值。

要阅读正确的值,您需要更新才能在&#34;之前发生。阅读它。只有当write和read都是在同一个对象上同步的内部块时,才能保证这一点。

同样在Run中,if语句周围没有同步,因此solde可能在检查值为&gt; = 2和递减值之间发生了变化。