On Fri, 8 Nov 2024 11:56:08 GMT, Quan Anh Mai <qa...@openjdk.org> wrote:
> Hi, > > This patch fixes the deadlock in `TestMemorySession#testAcquireCloseRace`. > The lock-step spin lock is implemented as with `lock` being an > `AtomicInteger`: > > // Keep the 2 threads operating on the same scope > int k = lock.getAndAdd(1) + 1; > while (k != i * 2) { > Thread.onSpinWait(); > k = lock.get(); > } > > Given the initial condition: > > Thread 1: i = 0 > Thread 2: i = 0 > lock: -2 > > The `lock` then undergoes the following operations: > > > > Thread 1 Thread 2 lock value > getAndAdd(1) -1 > getAndAdd(1) 0 -> Thread 2 then continues > its next iteration, its i value is now 1 > getAndAdd(1) 1 -> Thread 2 reaches the next > iteration before thread 1 has a chance to read the value 0 > get() 1 -> Thread 1 now cannot > proceed because it missed the value 0 > get() 1 -> Thread 2 now cannot > proceed because lock can never reach 2 > > > The solution is to not rely on the exact value of the lock but instead > whether the lock has passed the expected value. > > Testing: I have run this test several hundreds times and got no failure while > without this patch I encountered a timeout every approximately 30 times. > > Please take a look, thanks a lot. I think I also prefer Maurizio's version. ------------- PR Comment: https://git.openjdk.org/jdk/pull/21976#issuecomment-2465114542