java - 了解Java中的同步块(synchronized block)

标签 java synchronization thread-safety

我试图理解对象同步的概念。使用 Java Cert Book 中的这个示例,您能否帮助我理解以下两段代码之间的行为差​​异(一段代码我们在要保护其方法/操作免受竞争条件影响的对象上进行同步,另一段代码我们使用辅助对象作为锁来实现相同的目标):

1.

class Client {
  BankAccount account;

  public void updateTransaction() {
    synchronized (account) {     
      account.update();          // update is safe because of lock on account obj
    }
  }

  public double withdrawFunds() {
     double amt;
     synchronized (account) {
       account.calculateInterest();
       amt= account.withdraw();
     }
     return amt;
  }
}

2.

class Client {
  BankAccount account;
  Object lock = new Object();

  public void updateTransaction() {
    synchronized (lock) {     
      account.update();          // update is safe because of a lock        
    }
  }

  public double withdrawFunds() {
     double amt;
     synchronized (lock) {
       account.calculateInterest();
       amt= account.withdraw();
     }
     return amt;
  }
}

最佳答案

这两个都会抛出 NullPointerExceptions,但只是在不同的地方。

您应该始终在永远不会为 null(最终)的不可变引用上进行同步。

我想你的问题的答案是,对于给定的客户端,帐户可能会发生变化(假设有设置者),但锁定永远不会发生变化。同样,保证这一点的唯一方法是将其标记为最终的。

关于java - 了解Java中的同步块(synchronized block),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6444026/

相关文章:

java - System.currentTimeMillis 如何在短时间内返回不同长度的多头?

java - 为什么 NetBeans 在这里显示有关空指针取消引用的警告?

java - android - 无法实例化 Activity - ClassNotFound - 在一个 eclipse 上失败但在其他 eclipse 上失败

java - 将Java中的长字符串写入文件

c++ - 当 C++ const 方法同步可变状态时,非常量方法也必须这样做吗?

C#按时间同步2个不同类型的列表

java - 处理去同步

android - 取消同步时拒绝权限

java - 等待按下按钮(在 GUI 中)以推进代码

java - 如何在使用 EJB3 的 Java EE 环境中嵌入第三方代码