Java同步块中wait()方法对线程的影响及共享资源内存更新疑问
关于wait()释放锁时共享资源修改的主内存同步问题
先看你给出的代码:
synchronized (lockObject) { // update some value of the common shared resource lockObject.wait(); }
当调用lockObject.wait()时线程释放锁的那一刻,之前对共享资源的修改已经同步到主内存了,不需要等到整个同步块执行完成。
原因在于Java中synchronized块的核心语义就包含内存可见性保证:当线程退出同步块(包括通过wait()释放锁这种“提前退出”的场景)时,会强制把该线程工作内存中所有在同步块内修改的变量刷新到主内存,同时让其他线程工作内存中对应的变量失效。也就是说,后续获取到同一锁的线程,能直接看到这次修改后的最新值。
举个实际例子:如果线程A在同步块里把共享变量count从0改成1,随后调用wait()释放锁,那么线程B之后拿到lockObject的锁时,读取到的count一定是1,不会是旧值0。
内容的提问来源于stack exchange,提问作者Adarsh Verma
相关产品推荐
相关产品推荐

