<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Dear Kevin,<br>
<br>
If I understand you correctly, MapMaker.ExpiringComputingMap (which I
believe you are referring to) is thread safe.  Furthermore, it
guarantees that threads will wait until the first thread computes for a
given key.  <br>
<br>
Following is an excerpt of MapMaker.ExpiringComputingMap.  Here, if the
result is null, the compute method is called and the calculated value
is put.  How is it guaranteed that another thread does not concurrently
perform the latter (calculation and put operations)?  Is not this a
read-modify-write scheme which according to JCiP book is a compound
(not atomic) operation?<br>
<br>
In advance, thank you very much.<br>
<br>
<br>
    @Override<br>
    public V get(Object k) {<br>
      // from CustomConcurrentHashMap<br>
      V result = super.get(k);<br>
      if (result == null &amp;&amp; computer != null) {<br>
        /*<br>
         * This cast isn't safe, but we can rely on the fact that K is
almost<br>
         * always passed to Map.get(), and tools like IDEs and Findbugs
can<br>
         * catch situations where this isn't the case.<br>
         *<br>
         * The alternative is to add an overloaded method, but the
chances of<br>
         * a user calling get() instead of the new API and the risks
inherent<br>
         * in adding a new API outweigh this little hole.<br>
         */<br>
        @SuppressWarnings("unchecked")<br>
        K key = (K) k;<br>
        result = compute(key);<br>
      }<br>
      return result;<br>
    }<br>
<br>
    private V compute(K key) {<br>
      // from MapMaker<br>
      V value;<br>
      try {<br>
        value = computer.apply(key);<br>
      } catch (Throwable t) {<br>
        throw new ComputationException(t);<br>
      }<br>
<br>
      if (value == null) {<br>
        String message = computer + " returned null for key " + key +
".";<br>
        throw new NullPointerException(message);<br>
      }<br>
      put(key, value);<br>
      return value;<br>
    }<br>
<br>
<br>
<br>
On 11/03/2010 03:15 PM, Kevin Bourrillion wrote:
<blockquote
 cite="mid:AANLkTinu=eSu8_LZ=WNqvCwvmg38OSPNGOygmj6cuKAt@mail.gmail.com"
 type="cite">On Wed, Nov 3, 2010 at 5:31 AM, Nader Aeinehchi <span
 dir="ltr">&lt;<a moz-do-not-send="true"
 href="mailto:nader@aeinehchi.com">nader@aeinehchi.com</a>&gt;</span>
wrote:
  <div><br>
  <div class="gmail_quote">
  <blockquote class="gmail_quote"
 style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
    <div bgcolor="#ffffff" text="#000000">1. Please forgive me for my
ignorance, but ExpiringComputingMap does
not
guarantee that a computable to be calculated only once for concurrent
threads?<br>
    </div>
  </blockquote>
  <div><br>
  </div>
  <div>
  <meta charset="utf-8">
  <span class="Apple-style-span"
 style="font-family: Times; font-size: medium;">"</span><span
 class="Apple-style-span" style="font-family: Times; font-size: medium;"><a
 moz-do-not-send="true"
 href="http://java.sun.com/javase/6/docs/api/java/util/Map.html?is-external=true#get%28java.lang.Object%29"
 title="class or interface in java.util"><code>Map.get(java.lang.Object)</code></a></span><span
 class="Apple-style-span" style="font-family: Times; font-size: medium;"> </span><span
 class="Apple-style-span" style="font-family: Times; font-size: medium;">either
returns an already-computed value for the given key, atomically
computes it using the supplied function, or, if another thread is
currently computing the value for this key, simply waits for that
thread to finish and returns its computed value. Note that the function
may be executed concurrently by multiple threads, but only for distinct
keys."</span></div>
  <div><span class="Apple-style-span"
 style="font-family: Times; font-size: medium;"><br>
  </span></div>
  <div><br>
  </div>
  </div>
-- <br>
Kevin Bourrillion @ Google<br>
  <a moz-do-not-send="true" href="http://guava-libraries.googlecode.com">http://guava-libraries.googlecode.com</a><br>
  <br>
  </div>
</blockquote>
</body>
</html>