【问题标题】:How does capturing and releasing of lock of an object works in java synchronization?java同步中对象锁的捕获和释放如何工作?
【发布时间】:2017-10-28 13:18:42
【问题描述】:

如果一个线程正在执行一个同步方法,它会在完全完成该方法的执行之前释放该对象的锁吗?如果是,是什么情况?

如果一个线程(A) 正在执行同步方法,同时另一个线程(B) 尝试访问相同的同步方法(或该对象中的任何其他同步方法),它将进入BLOCKED 状态,但如果其他线程(B)尝试访问非同步方法,它会在第一个线程(A)完成同步方法的执行之前获得执行吗?还是只有在第一个线程(A)执行完同步方法后才会执行?

【问题讨论】:

  • 为什么你会认为锁会在同步块结束之前被释放?
  • 如果你在同步块内调用wait()
  • 否 - 除非它当然没有运行。或者如果它一开始没有得到它 - 请参阅lock elision
  • @BoristheSpider 并且在第一个线程完成同步方法的执行之前没有其他线程有机会执行?
  • 这是同步块的基本保证。任何时候只有一个处于RUNNING 状态的线程可以拥有监视器。内存屏障还提供了可见性保证。

标签: java multithreading synchronization thread-safety


【解决方案1】:

synchronized 方法只是编写同步 的捷径(参见https://stackoverflow.com/a/26676499/801894)。所以,不管你是在谈论一个同步的实例方法,还是一个同步的静态方法或一个同步的块,在这三种情况下,你实际上是在谈论同一件事。

Java 绝不允许同时在同一个对象上同步多个线程。理解该规则的唯一棘手部分是要知道,如果线程从 synchronized(foo){...} 块内部调用 foo.wait(),那么线程将在其内部时同步一段时间foo.wait() 电话。但是,可以保证在foo.wait() 调用返回之前,线程将再次在foo 上同步。

线程可以放弃其foo 同步的唯一其他方法是完全离开synchronized(foo) {...} 块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 2012-12-09
    • 2021-01-18
    相关资源
    最近更新 更多