[concurrency-interest] ConcurrentSkipListMap visibility guarantees

Martin Buchholz martinrb at google.com
Wed Jun 3 22:10:50 EDT 2020


DummyTimer has no constructor, so they are all created with a sequence of
zero, so initially they compare equal, so the map considers them
equivalent, and so the initial add may fail.

On Wed, Jun 3, 2020 at 6:00 PM Alexandre De Champeaux via
Concurrency-interest <concurrency-interest at cs.oswego.edu> wrote:

> Hello concurrency interest,
>
>
>
> I just came across some old code that concurrently does the following:
>
>    1. Remove Object o from ConcurrentSkipListMap
>    2. Mutate Object o
>    3. Add Object o back
>
> Sometimes, the remove will fail.
>
>
>
> I was wondering how badly this is abusing the guarantees of
> ConcurrentSkipListMap, and what makes the remove fail?
>
>
>
> Here is some code that reproduces (tried with Java 8u241 and 13.0.2):
>
>
>
>
>
> public class ConcurrentSkipListMapMissingRemove {
>
>     private final static AtomicLong SEQUENCE_CREATOR = new AtomicLong();
>
>     private final static Comparator<DummyTimer> myTimerComparator =
> Comparator.comparing(DummyTimer::getSequence);
>
>     private final static ConcurrentSkipListMap<DummyTimer, Long> theTimers
> = new ConcurrentSkipListMap<>(myTimerComparator);
>
>
>
>     public static void main(String[] args) throws InterruptedException {
>
>         for (int i = 0; i < 10; ++i) {
>
>             CompletableFuture.runAsync(() -> {
>
>                 DummyTimer myDummyTimer = new DummyTimer();
>
>                 myDummyTimer.start();
>
>
>
>                 while (true) {
>
>                     myDummyTimer.restart();
>
>                 }
>
>             });
>
>         }
>
>
>
>         Thread.sleep(100_000_000);
>
>     }
>
>
>
>     private static class DummyTimer {
>
>         private volatile long theSequence;
>
>
>
>         void start() {
>
>             add();
>
>         }
>
>
>
>         void restart() {
>
>             remove();
>
>             theSequence = SEQUENCE_CREATOR.getAndIncrement();
>
>             add();
>
>         }
>
>
>
>         private void add() {
>
>             theTimers.put(this, theSequence);
>
>         }
>
>
>
>         private void remove() {
>
>             if (theTimers.remove(this) == null) {
>
>                 System.out.println("Ooops, failed to remove...");
>
>             }
>
>         }
>
>
>
>         public long getSequence() {
>
>             return theSequence;
>
>         }
>
>     }
>
> }
>
>
>
> Thanks,
>
>
>
> Alex
> [image: IMC Logo] <https://www.imc.com/us/>
>
> [image: F] <https://www.facebook.com/IMCTrading>
>
> [image: t] <http://twitter.com/IMCTrading>
>
> [image: I] <https://www.instagram.com/imctrading/>
>
> [image: in] <https://www.linkedin.com/company/imc-financial-markets>
>
> *imc.com* <https://www.imc.com/us/>
> ------------------------------
> The information in this e-mail is intended only for the person or entity
> to which it is addressed.
>
> It may contain confidential and /or privileged material. If you are not
> the intended recipient, please notify us immediately and delete it from
> your system. Any other use or disclosure by you, including through
> automated tools operating on your systems is prohibited.
> _______________________________________________
> Concurrency-interest mailing list
> Concurrency-interest at cs.oswego.edu
> http://cs.oswego.edu/mailman/listinfo/concurrency-interest
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cs.oswego.edu/pipermail/concurrency-interest/attachments/20200603/4a936742/attachment-0001.htm>


More information about the Concurrency-interest mailing list