reentrant synchronization

前端 未结 3 1977
一整个雨季
一整个雨季 2021-02-15 12:24

Can you tell me if following invocations are reentrant or not?

public class Foo {

  public synchronized void doSomething() {}

  public synchronized void doAnot         


        
3条回答
  •  南方客
    南方客 (楼主)
    2021-02-15 13:16

    First of all, regarding reentrant locks in Java:

    Synchronized blocks in Java are reentrant. This means, that if a Java thread enters a synchronized block of code, and thereby take the lock on the monitor object the block is synchronized on, the thread can enter other Java code blocks synchronized on the same monitor object.

    Taken from here.

    The two consecutive calls you described (in doToo) will not be interfered unless another object has a reference to Too's private Foo, since, to access foo, one needs to lock Too. However, the calls do not invoke reentry as the locks are acquired and released for every call. They would be reentrant if doSomething called doAnotherSomething or vice versa.

提交回复
热议问题