【问题标题】:static synchronized and non static synchronized methods in threads difference in behavior线程中的静态同步和非静态同步方法的行为差异
【发布时间】:2016-03-20 06:35:17
【问题描述】:

我了解 Class 对象上的静态同步锁和 Object 实例上的非静态锁。

但是在这个问题的公认答案中:Static versus non-static lock object in synchronized block

当你使用非静态锁对象时:

  • 线程 1 调用 o1.foo()
  • 线程 2 调用 o1.foo(),必须等待线程 1 完成
  • 线程 3 调用 o2.foo(),它可以继续,不介意线程 1 和 2

为什么线程 3 可以在不考虑线程 1 和 2 的情况下继续运行。线程 3 是否必须等待从线程 1 或 2 获取对象实例“this”的锁才能继续执行?

【问题讨论】:

  • 您能详细说明您的问题吗?因为您提出的问题已在您提供的链接中得到解答 - 它们是不同的 Object 实例,因此线程 3 正在锁定线程 1 和 2 的另一个锁。
  • 是的,我的错,我认为它们是同一个实例,因此造成了混乱。

标签: java multithreading


【解决方案1】:

为什么线程 3 可以继续,而不考虑线程 1 和 2。

因为它锁定了一个不同的对象。

(除非o1 和o2 碰巧指向同一个对象......)

线程 3 是否必须等待从线程 1 或 2 获取对象实例“this”的锁才能继续执行?

不。这些调用分别尝试同步(即锁定)o1 和 o2。当foo() 方法调用开始时,这些将成为各个线程的this。在调用上下文中各个线程的this 不相关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多