【发布时间】:2017-10-28 13:18:42
【问题描述】:
如果一个线程正在执行一个同步方法,它会在完全完成该方法的执行之前释放该对象的锁吗?如果是,是什么情况?
如果一个线程(A) 正在执行同步方法,同时另一个线程(B) 尝试访问相同的同步方法(或该对象中的任何其他同步方法),它将进入BLOCKED 状态,但如果其他线程(B)尝试访问非同步方法,它会在第一个线程(A)完成同步方法的执行之前获得执行吗?还是只有在第一个线程(A)执行完同步方法后才会执行?
【问题讨论】:
-
为什么你会认为锁会在同步块结束之前被释放?
-
如果你在同步块内调用
wait()。 -
否 - 除非它当然没有运行。或者如果它一开始没有得到它 - 请参阅lock elision。
-
@BoristheSpider 并且在第一个线程完成同步方法的执行之前没有其他线程有机会执行?
-
这是同步块的基本保证。任何时候只有一个处于
RUNNING状态的线程可以拥有监视器。内存屏障还提供了可见性保证。
标签: java multithreading synchronization thread-safety