Sorry, I meant not GridCacheLockImpl but CacheLockImpl.

пт, 3 апр. 2020 г. в 17:04, Ivan Daschinskiy <ivanda...@gmail.com>:

> Folks,
>
> Lurking through code, it seems I found some concurrency issue in subj.
>
> * This class contains two fields, volatile Thread lockedThread and
> non-volatile int cntr (used for reentrancy)
>
> * private method incrementLockingCount() is called inside lock(). In this
> method we perform volatile read in assert
> (assert (lockedThread == null && cntr == 0) || (lockedThread ==
> Thread.currentThread() && cntr > 0) then increment cntr;
> * In method unlock(), we firstly decrement cntr and after that if cntr
> equals to 0, performs volatile write to lockedThread.
>
> Suppose execution when asserts are enabled.
>
> T1                                              |       T2
>
> -------------------------------------------------------------------------------
> cntr = cntr - 1       (cntr == 0)     |
> lockedThread = null                  |
>                                                  |    lockedThread == null
> && cntr == 0
>                                                  |   cntr = cntr + 1 (cntr
> == 1)
>
>
> There is a happens-before edge and we have strong guarantee that
> reentrancy will works and cntr will definitely equals to 1;
>
> But if assertions are disabled, something can go wrong.
>
> Moreover, if assertions are disabled, we can allow other thread do obtain
> lock even if our thread holds it.
>
> I think that this should be fixed, for example we can throw
> IllegalStateException, as in unlock() method.
>
> WDYT?
>
>
>

-- 
Sincerely yours, Ivan Daschinskiy

Reply via email to