java - java 中的同步给出了意外的输出

标签 java multithreading synchronization thread-safety

我正在翻阅一本书,看到一段代码,上面写着下面的代码是线程同步的:

//账户类别

 public class Account {

 private double balance;

 public double getBalance() {
 return balance;
}

 public void setBalance(double balance) {
 this.balance = balance;
}


 public synchronized void addAmount(double amount) {
 double tmp=balance;
 try {
 Thread.sleep(10);
 } catch (InterruptedException e) {
   e.printStackTrace();
 }
 tmp+=amount;
 balance=tmp;
}


public synchronized void subtractAmount(double amount) {
  double tmp=balance;
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
tmp-=amount;
balance=tmp;
}

}

//银行类

public class Bank implements Runnable {

 private Account account;
 public Bank(Account account) {
  this.account=account; 
}

@Override

public void run() {

for (int i=0; i<1000; i++){

     account.subtractAmount(1000);
  }
 }
}

//公司类

public class Company implements Runnable {

 private Account account;

 public Company(Account account) {
    this.account=account;
}

@Override

 public void run() {
   for (int i=0; i<1000; i++){
   account.addAmount(1000);
   }
  }
}

//主类

 public class Main {
 public static void main(String[] args) {
 Account account=new Account();
 account.setBalance(1000);
 Company company=new Company(account);
 Thread companyThread=new Thread(company);
 Bank bank=new Bank(account);
 Thread bankThread=new Thread(bank);
 System.out.printf("Account : Initial Balance: %f\n",account.
 getBalance());
 companyThread.start();
 bankThread.start();

 try {
   companyThread.join();
   bankThread.join();
   System.out.printf("Account : Final Balance: %f\n",account.
   getBalance());
 } 
    catch (InterruptedException e) {
    e.printStackTrace();
  }
 }
}

这里两个不同对象的两个线程正在使用addAmount和subtractAmount函数同时更改余额变量,但它总是给出正确的输出,因为初始和最终余额相同,即1000.000。我的意思是他们应该给我一些问题,因为两个线程同时处理同一个变量。

请纠正我哪里错了。 提前致谢

最佳答案

这就是同步的全部意义。它确保一次只有一个线程可以执行该函数。

关于java - java 中的同步给出了意外的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42576133/

相关文章:

java - Java Android开发 “Failure in SSL library, usually a protocol”

java - 是否可以使用 Apache Camel 实现服务器推送?

python - 如何在Python中更快地计算中位数

multithreading - 使用 QWaitCondition 唤醒线程

mysql - 如何使用触发器更新另一个数据库中的表?

ios - 同步录音/回放ios

java - 无法访问 Java 创建的文件——有时

java - java 文件帮助

java - 同步库/第三方类?

java - Hazelcast 分布式计算的基本概念