Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #11497

Re: Volatile happens before question

From markspace <-@.>
Newsgroups comp.lang.java.programmer
Subject Re: Volatile happens before question
Date 2012-01-19 09:40 -0800
Organization A noiseless patient Spider
Message-ID <jf9kid$vac$1@dont-email.me> (permalink)
References (15 earlier) <652cb878-fb2f-4361-8f70-61bc493cebf6@r16g2000yqi.googlegroups.com> <jf7crq$p30$1@dont-email.me> <6280ea10-c656-40fa-ba3d-50f24d471978@j15g2000yqb.googlegroups.com> <jf7n1d$ojv$1@dont-email.me> <6b44805b-ff63-41ba-8060-cbd92164f9d6@o9g2000yqa.googlegroups.com>

Show all headers | View raw


On 1/19/2012 8:18 AM, raphfrk@gmail.com wrote:

> Yes that is correct, it is also possible that it goes:
>
> Thread 1                        Thread 2
> Writer                          Reader
>
> W1: map.put() // write
>                                   R1: writeCounter.get() // happens
> before
>                                   R2: map.get()          // read
>                                   R3: writerCounter.get() // happens
> before
> W2: writeCounter.increment()


That one I specifically don't see.  If you get a reader and a writer 
accessing the map at the same time, then the reader will detect a change 
and retry the operation.  There's two get's on the reader side, it might 
be useful to distinguish between them.

public V get(Object key) {
   int save = 0;
   V value = null;
   do {
     while (((save = writeCounter.get()) & 1) == 1);  // RA
     value = map.get(key);
   } while (save != writeCounter.get());              // RB
   return value;
}

I'll do the same on the writer side just for clarity.

public V put(K key, V value) {
   lock.lock();
   try {
     writeCounter.getAndIncrement();                // WA
     map.put(key, value);
     writeCounter.getAndIncrement();                // WB
   } finally {
     lock.unlock();
   }
   return value;
}


So here's how I parse a "failed" read.

Thread 1                        Thread 2
Writer                          Reader

                                 writerCounter.get()  // RA
writeCounter.increment() // WA
map.put()
                                 // 1: No happens-before here

                                 map.get()
                                 writerCounter.get()  // RB
                                 writerCounter.get()  // RA

                                 // 2: this repeats until...

writeCounter.increment() // WB
                          -----> writerCounter.get()  // RA
                                 map.get()
                                 writerCounter.get()  // RB


The ----> arrow indicates the happens-before (which is the same way the 
JLS shows happens-before).

(I'm ignoring the happens-before for the writeCounter itself.  That 
there is such a relationship should be obvious.)

Now with the WB -> RA pair there's been happens before relationship 
established and the second map.get() in the reader thread is ok.

The first map.get() is fubar but according to Patricia we should at 
least expect to get back from the get call with only bad data, no other 
problems.  Likewise, the write should not be expected to create "out of 
this air" values.  If so, then the second read should be clean.

Back to comp.lang.java.programmer | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

Volatile happens before question "raphfrk@gmail.com" <raphfrk@gmail.com> - 2012-01-17 04:04 -0800
  Re: Volatile happens before question Peter Duniho <NpOeStPeAdM@NnOwSlPiAnMk.com> - 2012-01-17 08:17 -0800
    Re: Volatile happens before question markspace <-@.> - 2012-01-17 08:50 -0800
      Re: Volatile happens before question "raphfrk@gmail.com" <raphfrk@gmail.com> - 2012-01-17 09:00 -0800
    Re: Volatile happens before question "raphfrk@gmail.com" <raphfrk@gmail.com> - 2012-01-17 08:54 -0800
      Re: Volatile happens before question markspace <-@.> - 2012-01-17 11:24 -0800
    Re: Volatile happens before question Patricia Shanahan <pats@acm.org> - 2012-01-17 14:49 -0800
      Re: Volatile happens before question Knute Johnson <nospam@knutejohnson.com> - 2012-01-17 15:49 -0800
      Re: Volatile happens before question Peter Duniho <NpOeStPeAdM@NnOwSlPiAnMk.com> - 2012-01-17 17:14 -0800
        Re: Volatile happens before question Patricia Shanahan <pats@acm.org> - 2012-01-17 18:17 -0800
          Re: Volatile happens before question Joshua Maurice <joshuamaurice@gmail.com> - 2012-01-19 16:45 -0800
  Re: Volatile happens before question Knute Johnson <nospam@knutejohnson.com> - 2012-01-17 08:18 -0800
    Re: Volatile happens before question markspace <-@.> - 2012-01-17 08:33 -0800
      Re: Volatile happens before question Knute Johnson <nospam@knutejohnson.com> - 2012-01-17 08:49 -0800
        Re: Volatile happens before question Knute Johnson <nospam@knutejohnson.com> - 2012-01-17 09:21 -0800
          Re: Volatile happens before question markspace <-@.> - 2012-01-17 10:10 -0800
            Re: Volatile happens before question Daniel Pitts <newsgroup.nospam@virtualinfinity.net> - 2012-01-17 10:28 -0800
              Re: Volatile happens before question markspace <-@.> - 2012-01-17 10:41 -0800
                Re: Volatile happens before question Daniel Pitts <newsgroup.nospam@virtualinfinity.net> - 2012-01-17 11:06 -0800
                Re: Volatile happens before question markspace <-@.> - 2012-01-17 12:09 -0800
                Re: Volatile happens before question markspace <-@.> - 2012-01-17 12:12 -0800
                Re: Volatile happens before question "raphfrk@gmail.com" <raphfrk@gmail.com> - 2012-01-17 12:38 -0800
                Re: Volatile happens before question markspace <-@.> - 2012-01-17 13:35 -0800
                Re: Volatile happens before question markspace <-@.> - 2012-01-17 14:41 -0800
                Re: Volatile happens before question Patricia Shanahan <pats@acm.org> - 2012-01-17 14:55 -0800
                Re: Volatile happens before question markspace <-@.> - 2012-01-17 15:27 -0800
                Re: Volatile happens before question Peter Duniho <NpOeStPeAdM@NnOwSlPiAnMk.com> - 2012-01-17 17:37 -0800
                Re: Volatile happens before question Peter Duniho <NpOeStPeAdM@NnOwSlPiAnMk.com> - 2012-01-17 17:42 -0800
            Re: Volatile happens before question Knute Johnson <nospam@knutejohnson.com> - 2012-01-17 15:46 -0800
              Re: Volatile happens before question markspace <-@.> - 2012-01-17 16:14 -0800
                Re: Volatile happens before question Knute Johnson <nospam@knutejohnson.com> - 2012-01-17 20:01 -0800
                Re: Volatile happens before question Peter Duniho <NpOeStPeAdM@NnOwSlPiAnMk.com> - 2012-01-17 20:37 -0800
                Re: Volatile happens before question Knute Johnson <nospam@knutejohnson.com> - 2012-01-17 21:52 -0800
                Re: Volatile happens before question Peter Duniho <NpOeStPeAdM@NnOwSlPiAnMk.com> - 2012-01-17 23:47 -0800
                Re: Volatile happens before question Peter Duniho <NpOeStPeAdM@NnOwSlPiAnMk.com> - 2012-01-18 00:08 -0800
                Re: Volatile happens before question Knute Johnson <nospam@knutejohnson.com> - 2012-01-18 09:04 -0800
                Re: Volatile happens before question Steven Simpson <ss@domain.invalid> - 2012-01-18 11:22 +0000
                Re: Volatile happens before question "raphfrk@gmail.com" <raphfrk@gmail.com> - 2012-01-18 06:24 -0800
                Re: Volatile happens before question Peter Duniho <NpOeStPeAdM@NnOwSlPiAnMk.com> - 2012-01-18 07:32 -0800
                Re: Volatile happens before question "raphfrk@gmail.com" <raphfrk@gmail.com> - 2012-01-18 08:34 -0800
                Re: Volatile happens before question markspace <-@.> - 2012-01-18 10:12 -0800
                Re: Volatile happens before question "raphfrk@gmail.com" <raphfrk@gmail.com> - 2012-01-18 11:15 -0800
                Re: Volatile happens before question markspace <-@.> - 2012-01-18 11:59 -0800
                Re: Volatile happens before question "raphfrk@gmail.com" <raphfrk@gmail.com> - 2012-01-18 12:24 -0800
                Re: Volatile happens before question markspace <-@.> - 2012-01-18 13:16 -0800
                Re: Volatile happens before question Knute Johnson <nospam@knutejohnson.com> - 2012-01-18 15:00 -0800
                Re: Volatile happens before question markspace <-@.> - 2012-01-18 16:12 -0800
                Re: Volatile happens before question Patricia Shanahan <pats@acm.org> - 2012-01-18 16:34 -0800
                Re: Volatile happens before question markspace <-@.> - 2012-01-18 17:17 -0800
                Re: Volatile happens before question Patricia Shanahan <pats@acm.org> - 2012-01-18 19:03 -0800
                Re: Volatile happens before question "raphfrk@gmail.com" <raphfrk@gmail.com> - 2012-01-18 15:30 -0800
                Re: Volatile happens before question markspace <-@.> - 2012-01-18 16:10 -0800
                Re: Volatile happens before question "raphfrk@gmail.com" <raphfrk@gmail.com> - 2012-01-19 08:18 -0800
                Re: Volatile happens before question markspace <-@.> - 2012-01-19 09:40 -0800
                Re: Volatile happens before question "raphfrk@gmail.com" <raphfrk@gmail.com> - 2012-01-19 10:10 -0800
                Re: Volatile happens before question markspace <-@.> - 2012-01-19 10:39 -0800
                Re: Volatile happens before question "raphfrk@gmail.com" <raphfrk@gmail.com> - 2012-01-19 12:13 -0800
                Re: Volatile happens before question markspace <-@.> - 2012-01-19 13:31 -0800
                Re: Volatile happens before question "raphfrk@gmail.com" <raphfrk@gmail.com> - 2012-01-19 16:14 -0800
                Re: Volatile happens before question markspace <-@.> - 2012-01-19 21:16 -0800
                Re: Volatile happens before question "raphfrk@gmail.com" <raphfrk@gmail.com> - 2012-01-20 03:23 -0800
                Re: Volatile happens before question "raphfrk@gmail.com" <raphfrk@gmail.com> - 2012-01-20 06:46 -0800
                Re: Volatile happens before question markspace <-@.> - 2012-01-20 08:56 -0800
                Re: Volatile happens before question Lew <noone@lewscanon.com> - 2012-01-20 11:12 -0800
                Re: Volatile happens before question Peter Duniho <NpOeStPeAdM@NnOwSlPiAnMk.com> - 2012-01-18 17:06 -0800
                Re: Volatile happens before question Daniel Pitts <newsgroup.nospam@virtualinfinity.net> - 2012-01-19 12:46 -0800
                Re: Volatile happens before question markspace <-@.> - 2012-01-19 13:38 -0800
                Re: Volatile happens before question Peter Duniho <NpOeStPeAdM@NnOwSlPiAnMk.com> - 2012-01-18 07:32 -0800
                Re: Volatile happens before question Lew <noone@lewscanon.com> - 2012-01-18 00:06 -0800
                Re: Volatile happens before question Knute Johnson <nospam@knutejohnson.com> - 2012-01-18 09:23 -0800
                Re: Volatile happens before question Joshua Maurice <joshuamaurice@gmail.com> - 2012-01-19 17:07 -0800
                Re: Volatile happens before question Joshua Maurice <joshuamaurice@gmail.com> - 2012-01-19 17:12 -0800
                Re: Volatile happens before question Joshua Maurice <joshuamaurice@gmail.com> - 2012-01-19 19:22 -0800
  Re: Volatile happens before question Daniel Pitts <newsgroup.nospam@virtualinfinity.net> - 2012-01-17 10:24 -0800

csiph-web