Java 线程 "synchronized"

标签 java thread-safety synchronized

article谈论 Java 的“同步”关键字。

  ...
  private int foo;
  public synchronized int getFoo() { return foo; } 
  public synchronized void setFoo(int f) { foo = f; }

如果调用者想要增加 foo 属性,则以下代码不是线程安全的:

  ...
  setFoo(getFoo() + 1);

如果两个线程同时尝试增加 foo,结果可能是 foo 的值增加 1 或 2,具体取决于时间。

现在,我的问题:

Why doesn't "synchronized" on setFoo() prevent the above bolded line?

最佳答案

这是先检查后执行竞争条件的示例。

可能会发生如下情况:

Thread-1 getFoo() returns 0
Thread-2 getFoo() returns 0
Thread-2 setFoo(1)
Thread-1 setFoo(1)

这意味着两个线程都试图递增 foo,但它的效果是只递增一次。

正如其他答案所确定的那样,将增量与锁定在与 getFoo() 和 setFoo() 相同的对象上的同步块(synchronized block)同步将防止这种竞争情况,因为线程将无法像上面那样交错。

关于Java 线程 "synchronized",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15118824/

相关文章:

java - 字节数组操作

java - SQL 请求和循环结果最佳模式

java - 如何正确退出独立的 Java Play Framework 脚本?

c# - 线程安全的 List<T> 属性

android - 内容提供者和内容观察者同步

java - Hibernate:相对于自定义@Transactional(timeout)的默认事务超时

java - 如何在android中为多个线程使用多个按钮?

thread-safety - 在Akka中,ActorContext线程安全吗?

java - Java 如何处理以下场景?

可重入同步块(synchronized block)中的 Java 等待/通知