捕获和释放对象的锁如何在java同步中工作?

时间:2017-10-28 13:18:42

标签: java multithreading synchronization thread-safety

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

如果一个线程(A)正在执行synchronized方法,并且同时其他线程(B)尝试访问同一个同步方法(或该对象中的任何其他同步方法),它将进入iex(1)> Enum.find_value(["foo", "bar"],false, fn(x)-> x=="foo" end) true iex(2)> Enum.find_value(["foo", "bar"],false, fn(x)-> x=="food" end) false 状态,但是如果另一个线程(B)尝试访问非同步方法,它将在第一个线程(A)完成同步方法的执行之前获得执行吗?或者只有在第一个线程(A)完成同步方法的执行后才会执行执行?

1 个答案:

答案 0 :(得分:1)

synchronized方法只是编写同步的快捷方式(请参阅https://stackoverflow.com/a/26676499/801894)。因此,无论您是在谈论同步实例方法,还是同步静态方法或同步块,您在所有三种情况下都在谈论同样的事情。

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

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