<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@font-face
        {font-family:Courier;
        panose-1:0 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
p.gmail-m1605684057624079682gmail-m-2212015834539774438msolistparagraph, li.gmail-m1605684057624079682gmail-m-2212015834539774438msolistparagraph, div.gmail-m1605684057624079682gmail-m-2212015834539774438msolistparagraph
        {mso-style-name:gmail-m_1605684057624079682gmail-m-2212015834539774438msolistparagraph;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle21
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:1547912027;
        mso-list-template-ids:-1937740700;}
ol
        {margin-bottom:0cm;}
ul
        {margin-bottom:0cm;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-AU" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Thanks for the quick reply Martin.
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">That does sound pretty fair.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span style="font-size:12.0pt;color:black">From: </span></b><span style="font-size:12.0pt;color:black">Martin Buchholz <martinrb@google.com><br>
<b>Date: </b>Thursday, 4 June 2020 at 2:09 pm<br>
<b>To: </b>Alexandre De Champeaux <alexandre.dechampeaux@imc.com><br>
<b>Cc: </b>"concurrency-interest@cs.oswego.edu" <concurrency-interest@cs.oswego.edu><br>
<b>Subject: </b>Re: [concurrency-interest] ConcurrentSkipListMap visibility guarantees<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">The comparator is called with two keys in the map.  Even normally, the map has to deal with the possibility of a key being asynchronously removed while the comparator is running.  But it's really too much to expect that the map will be
 able to sanely handle the value of the key changing and being reinserted elsewhere in the map while the comparator is running.
<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Another way to look at it is that a key might be in use by a comparator for an arbitrarily long time after it has been removed, so the key object can never be mutated and reused.<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">On Wed, Jun 3, 2020 at 8:23 PM Alexandre De Champeaux <<a href="mailto:alexandre.dechampeaux@imc.com">alexandre.dechampeaux@imc.com</a>> wrote:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm">
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Ah yes, I dumbed down the example too much…<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Here it is again (But now with theSequence being updated inside add):<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">public class ConcurrentSkipListMapMissingRemove {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">    private final static AtomicLong SEQUENCE_CREATOR = new AtomicLong();</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">    private final static Comparator<DummyTimer> COMPARATOR = Comparator.comparing(DummyTimer::getSequence);</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">    private final static ConcurrentSkipListMap<DummyTimer, Long> TIMERS = new ConcurrentSkipListMap<>(COMPARATOR);</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">    public static void main(String[] args) throws InterruptedException {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        for (int i = 0; i < 10; ++i) {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">            CompletableFuture.runAsync(() -> {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">                DummyTimer myDummyTimer = new DummyTimer();</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">                myDummyTimer.start();</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">                while (true) {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">                    myDummyTimer.restart();</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">                }</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">            });</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        }</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        Thread.sleep(100_000_000);</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">    }</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">    private static class DummyTimer {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        private volatile long theSequence;</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        void start() {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">            add();</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        }</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        void restart() {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">            remove();</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">            add();</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        }</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        private void add() {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">            theSequence = SEQUENCE_CREATOR.getAndIncrement();</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">            TIMERS.put(this, theSequence);</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        }</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        private void remove() {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">            if (TIMERS.remove(this) == null) {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">                System.out.println("Ooops, failed to remove...");</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">            }</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        }</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        public long getSequence() {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">            return theSequence;</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        }</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">    }</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">}</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><b><span style="font-size:12.0pt;color:black">From:
</span></b><span style="font-size:12.0pt;color:black">Martin Buchholz <<a href="mailto:martinrb@google.com" target="_blank">martinrb@google.com</a>><br>
<b>Date: </b>Thursday, 4 June 2020 at 12:11 pm<br>
<b>To: </b>Alexandre De Champeaux <<a href="mailto:alexandre.dechampeaux@imc.com" target="_blank">alexandre.dechampeaux@imc.com</a>><br>
<b>Cc: </b>"<a href="mailto:concurrency-interest@cs.oswego.edu" target="_blank">concurrency-interest@cs.oswego.edu</a>" <<a href="mailto:concurrency-interest@cs.oswego.edu" target="_blank">concurrency-interest@cs.oswego.edu</a>><br>
<b>Subject: </b>Re: [concurrency-interest] ConcurrentSkipListMap visibility guarantees</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">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.<o:p></o:p></p>
</div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">On Wed, Jun 3, 2020 at 6:00 PM Alexandre De Champeaux via Concurrency-interest <<a href="mailto:concurrency-interest@cs.oswego.edu" target="_blank">concurrency-interest@cs.oswego.edu</a>>
 wrote:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0cm;margin-bottom:5.0pt">
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Hello concurrency interest,<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">I just came across some old code that concurrently does the following:<o:p></o:p></p>
<ol start="1" type="1">
<li class="gmail-m1605684057624079682gmail-m-2212015834539774438msolistparagraph" style="mso-list:l0 level1 lfo1">
Remove Object o from ConcurrentSkipListMap<o:p></o:p></li><li class="gmail-m1605684057624079682gmail-m-2212015834539774438msolistparagraph" style="mso-list:l0 level1 lfo1">
Mutate Object o<o:p></o:p></li><li class="gmail-m1605684057624079682gmail-m-2212015834539774438msolistparagraph" style="mso-list:l0 level1 lfo1">
Add Object o back<o:p></o:p></li></ol>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Sometimes, the remove will fail.<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">I was wondering how badly this is abusing the guarantees of ConcurrentSkipListMap, and what makes the remove fail?<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Here is some code that reproduces (tried with Java 8u241 and 13.0.2):<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">public class ConcurrentSkipListMapMissingRemove {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">    private final static AtomicLong SEQUENCE_CREATOR = new AtomicLong();</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">    private final static Comparator<DummyTimer> myTimerComparator = Comparator.comparing(DummyTimer::getSequence);</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">    private final static ConcurrentSkipListMap<DummyTimer, Long> theTimers = new ConcurrentSkipListMap<>(myTimerComparator);</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">    public static void main(String[] args) throws InterruptedException {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        for (int i = 0; i < 10; ++i) {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">            CompletableFuture.runAsync(() -> {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">                DummyTimer myDummyTimer = new DummyTimer();</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">                myDummyTimer.start();</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">                while (true) {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">                    myDummyTimer.restart();</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">                }</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">            });</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        }</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        Thread.sleep(100_000_000);</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">    }</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">    private static class DummyTimer {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        private volatile long theSequence;</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        void start() {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">            add();</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        }</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        void restart() {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">            remove();</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">            theSequence = SEQUENCE_CREATOR.getAndIncrement();</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">            add();</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        }</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        private void add() {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">            theTimers.put(this, theSequence);</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        }</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        private void remove() {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">            if (theTimers.remove(this) == null) {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">                System.out.println("Ooops, failed to remove...");</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">            }</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        }</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        public long getSequence() {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">            return theSequence;</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">        }</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">    }</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-family:Courier">}</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Thanks,<o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Alex<o:p></o:p></p>
</div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><a href="https://www.imc.com/us/" target="_blank"><b><span lang="EN-GB" style="border:solid windowtext 1.0pt;padding:0cm;text-decoration:none">Error! Filename not specified.</span></b></a><o:p></o:p></p>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" width="450" style="width:337.5pt;border-collapse:collapse">
<tbody>
<tr>
<td width="32" style="width:24.0pt;padding:0cm 0cm 0cm 0cm">
<p style="line-height:12.0pt"><span style="font-family:"Arial",sans-serif"><a href="https://www.facebook.com/IMCTrading" target="_blank"><b><span lang="EN-GB" style="border:solid windowtext 1.0pt;padding:0cm;text-decoration:none">Error! Filename not specified.</span></b></a></span><o:p></o:p></p>
</td>
<td width="32" style="width:24.0pt;padding:0cm 0cm 0cm 7.5pt">
<p style="line-height:12.0pt"><span style="font-family:"Arial",sans-serif"><a href="http://twitter.com/IMCTrading" target="_blank"><b><span lang="EN-GB" style="border:solid windowtext 1.0pt;padding:0cm;text-decoration:none">Error! Filename not specified.</span></b></a></span><o:p></o:p></p>
</td>
<td width="32" style="width:24.0pt;padding:0cm 0cm 0cm 7.5pt">
<p style="line-height:12.0pt"><span style="font-family:"Arial",sans-serif"><a href="https://www.instagram.com/imctrading/" target="_blank"><b><span lang="EN-GB" style="border:solid windowtext 1.0pt;padding:0cm;text-decoration:none">Error! Filename not specified.</span></b></a></span><o:p></o:p></p>
</td>
<td width="32" style="width:24.0pt;padding:0cm 0cm 0cm 7.5pt">
<p style="line-height:12.0pt"><span style="font-family:"Arial",sans-serif"><a href="https://www.linkedin.com/company/imc-financial-markets" target="_blank"><b><span lang="EN-GB" style="border:solid windowtext 1.0pt;padding:0cm;text-decoration:none">Error! Filename
 not specified.</span></b></a></span><o:p></o:p></p>
</td>
<td style="padding:0cm 0cm 0cm 7.5pt">
<p style="line-height:12.0pt"><span style="font-size:11.5pt;font-family:"Arial",sans-serif;color:#0082BA"><a href="https://www.imc.com/us/" target="_blank"><strong><span style="font-family:"Arial",sans-serif;color:#0082BA;text-decoration:none">imc.com</span></strong></a></span><o:p></o:p></p>
</td>
</tr>
</tbody>
</table>
<div>
<div class="MsoNormal" align="center" style="text-align:center"><span style="color:white">
<hr size="0" width="100%" align="center">
</span></div>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-size:7.5pt;font-family:"Arial",sans-serif;color:gray">The information in this e-mail is intended only for the person or entity to which it is addressed.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-size:7.5pt;font-family:"Arial",sans-serif;color:gray"><br>
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.
</span><o:p></o:p></p>
</div>
</div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">_______________________________________________<br>
Concurrency-interest mailing list<br>
<a href="mailto:Concurrency-interest@cs.oswego.edu" target="_blank">Concurrency-interest@cs.oswego.edu</a><br>
<a href="http://cs.oswego.edu/mailman/listinfo/concurrency-interest" target="_blank">http://cs.oswego.edu/mailman/listinfo/concurrency-interest</a><o:p></o:p></p>
</blockquote>
</div>
</div>
<p class="MsoNormal"><a href="https://www.imc.com/us/" target="_blank"><span style="color:windowtext;text-decoration:none"><span style="color:blue;border:solid windowtext 1.0pt;padding:0cm"><img border="0" width="165" height="30" style="width:1.7187in;height:.3125in" id="_x0000_i1030" src="cid:~WRD0001.jpg" alt="Image removed by sender. IMC Logo"></span></span></a><o:p></o:p></p>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" width="450" style="width:337.5pt;border-collapse:collapse">
<tbody>
<tr>
<td width="32" style="width:24.0pt;padding:0cm 0cm 0cm 0cm">
<p style="line-height:12.0pt"><span style="font-family:"Arial",sans-serif"><a href="https://www.facebook.com/IMCTrading" target="_blank"><span style="color:windowtext;text-decoration:none"><span style="color:blue;border:solid windowtext 1.0pt;padding:0cm"><img border="0" width="32" height="32" style="width:.3333in;height:.3333in" id="_x0000_i1029" src="cid:~WRD0001.jpg" alt="Image removed by sender. F"></span></span></a><o:p></o:p></span></p>
</td>
<td width="32" style="width:24.0pt;padding:0cm 0cm 0cm 7.5pt">
<p style="line-height:12.0pt"><span style="font-family:"Arial",sans-serif"><a href="http://twitter.com/IMCTrading" target="_blank"><span style="color:windowtext;text-decoration:none"><span style="color:blue;border:solid windowtext 1.0pt;padding:0cm"><img border="0" width="32" height="32" style="width:.3333in;height:.3333in" id="_x0000_i1028" src="cid:~WRD0001.jpg" alt="Image removed by sender. t"></span></span></a><o:p></o:p></span></p>
</td>
<td width="32" style="width:24.0pt;padding:0cm 0cm 0cm 7.5pt">
<p style="line-height:12.0pt"><span style="font-family:"Arial",sans-serif"><a href="https://www.instagram.com/imctrading/" target="_blank"><span style="color:windowtext;text-decoration:none"><span style="color:blue;border:solid windowtext 1.0pt;padding:0cm"><img border="0" width="32" height="32" style="width:.3333in;height:.3333in" id="_x0000_i1027" src="cid:~WRD0001.jpg" alt="Image removed by sender. I"></span></span></a><o:p></o:p></span></p>
</td>
<td width="32" style="width:24.0pt;padding:0cm 0cm 0cm 7.5pt">
<p style="line-height:12.0pt"><span style="font-family:"Arial",sans-serif"><a href="https://www.linkedin.com/company/imc-financial-markets" target="_blank"><span style="color:windowtext;text-decoration:none"><span style="color:blue;border:solid windowtext 1.0pt;padding:0cm"><img border="0" width="32" height="32" style="width:.3333in;height:.3333in" id="_x0000_i1026" src="cid:~WRD0001.jpg" alt="Image removed by sender. in"></span></span></a><o:p></o:p></span></p>
</td>
<td style="padding:0cm 0cm 0cm 7.5pt">
<p style="line-height:12.0pt"><span style="font-size:11.5pt;font-family:"Arial",sans-serif;color:#0082BA"><a href="https://www.imc.com/us/" target="_blank"><strong><span style="font-family:"Arial",sans-serif;color:#0082BA;text-decoration:none">imc.com</span></strong></a><o:p></o:p></span></p>
</td>
</tr>
</tbody>
</table>
<div>
<div class="MsoNormal" align="center" style="text-align:center"><span style="color:white">
<hr size="0" width="100%" align="center">
</span></div>
</div>
<div>
<p class="MsoNormal"><span style="font-size:7.5pt;font-family:"Arial",sans-serif;color:gray">The information in this e-mail is intended only for the person or entity to which it is addressed.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:7.5pt;font-family:"Arial",sans-serif;color:gray"><br>
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.
</span><o:p></o:p></p>
</div>
</div>
</blockquote>
</div>
</div>
<style type="text/css">
a {text-decoration: none;}
</style>
<title></title>
<a href="https://www.imc.com/us/" style="text-decoration:none;"><img src="https://www.imc.com/media/1192/imc_logo_rgb_v_80b206.png" alt="IMC Logo" width="165" height="30" border="0"></a>
<table style="font-family: Arial; line-height:
16px;border-collapse:collapse;" width="450" cellspacing="0" cellpadding="0" border="0">
<tbody>
<tr>
<td style="padding-left:0px;padding-right:0px;" width="32">
<p><a href="https://www.facebook.com/IMCTrading" style="text-decoration:none;"><img src="https://www.imc.com/media/1188/social-02_v_206c6c.png" alt="F" width="32" height="32"></a></p>
</td>
<td style="padding-left:10px;" width="32">
<p><a href="http://twitter.com/IMCTrading" style="text-decoration:none;"><img src="https://www.imc.com/media/1189/social-03_v_517cd5.png" alt="t" width="32" height="32"></a></p>
</td>
<td style="padding-left:10px;" width="32">
<p><a href="https://www.instagram.com/imctrading/" style="text-decoration:none;"><img src="https://www.imc.com/media/1190/social-04_v_01e297.png" alt="I" width="32" height="32"></a></p>
</td>
<td style="padding-left:10px;" width="32">
<p><a href="https://www.linkedin.com/company/imc-financial-markets" style="text-decoration:none;"><img src="https://www.imc.com/media/1187/social-01_v_34b915.png" alt="in" width="32" height="32"></a></p>
</td>
<td style="padding-left:10px;vertical-align:middle;">
<p style="font-size:15px;color:#0082ba;"><a href="https://www.imc.com/us/" style="text-decoration:none
!important;text-decoration:none;color:#0082ba;"><span style="text-decoration:none;"><strong style="font-weight:bold;text-decoration:none;">imc.com</strong></span></a></p>
</td>
</tr>
</tbody>
</table>
<div>
<hr>
</div>
<div><span style="color: gray; font-family: Arial; font-size: xx-small;">The information in this e-mail is intended only for the person or entity to which it is addressed.</span></div>
<div><span style="color: gray; font-family: Arial; font-size: xx-small;"><br>
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.
</span></div>
</body>
</html>