如果一个线程正在执行一个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)完成同步方法的执行后才会执行执行?
答案 0 :(得分:1)
synchronized
方法只是编写同步块的快捷方式(请参阅https://stackoverflow.com/a/26676499/801894)。因此,无论您是在谈论同步实例方法,还是同步静态方法或同步块,您在所有三种情况下都在谈论同样的事情。
Java永远不会允许同时在同一个对象上同步多个线程。理解该规则的唯一棘手的部分是知道如果一个线程从foo.wait()
块内部调用synchronized(foo){...}
,那么线程将不在一段时间内同步而它在foo.wait()
电话里面。但是,保证线程将在foo
调用返回之前再次在foo.wait()
上同步。
线程放弃foo
同步的唯一方法是完全离开synchronized(foo) {...}
块。