[concurrency-interest] synchronization based on a key

Dimitris Andreou jim.andreou at gmail.com
Thu May 31 12:36:47 EDT 2012


Equal keys -> their hashes will be the same, thus they will map to the same
bucket/stripe/lock, just like a hashtable.

Talked to guava people and we'll be releasing it soon after all (and its
tests).
On May 31, 2012 8:30 AM, "bhm" <bheem at sbcglobal.net> wrote:

> are there any testcases for this, how can I test for correctness that
> is same keys are not being entered from multiple threads.
>
> On Thu, May 24, 2012 at 2:22 PM, Dimitris Andreou <jim.andreou at gmail.com>
> wrote:
> > Yes. Basically you choose a point in the trade-off of "how much memory
> > you're willing to spend on lock stripes" vs "how many accidental
> collisions
> > (different keys mapped to the same lock) you can tolerate".
> >
> > The other option is whether you want to preallocate all locks (and get a
> > compact representation for them; viable for small sets of stripes, but
> not
> > if you want millions of them), or allocate them dynamically (needs a
> > ConcurrentMap and the overhead is higher)
> >
> > On Thu, May 24, 2012 at 10:48 AM, bhm <bheem at sbcglobal.net> wrote:
> >>
> >> Thanks.
> >>
> >> If I understand this correctly, this keeps a collection of lock
> >> objects (Lock/Semaphore/ReadWriteLock) and smear method can map
> >> multiple keys to same index and
> >> so same lock and amount of concurrency is contained by the size of
> >> collection of lock objects (eager or lazy)
> >>
> >> On Thu, May 24, 2012 at 12:13 PM, Dimitris Andreou
> >> <jim.andreou at gmail.com> wrote:
> >> > http://code.google.com/p/guava-libraries/issues/detail?id=859#c11
> >> >
> >> > The file attached to the linked comment might end up in guava, and
> deals
> >> > with this very problem.
> >> >
> >> > On May 24, 2012 7:27 AM, "bhm" <bheem at sbcglobal.net> wrote:
> >> >>
> >> >> I have a method that needs to be synchronized based on a key passed
> as
> >> >> parameter, that is, for same key multiple threads shouldn't be
> >> >> running. Following is what I did--
> >> >>
> >> >>
> >> >> static final ConcurrentMap<String,Boolean> IN_PROGRESS =
> >> >>   new ConcurrentHashMap<String,Boolean>();
> >> >>
> >> >> void foo(String key){
> >> >>    if(null == IN_PROGRESS.putIfAbsent(key, Boolean.TRUE)){
> >> >>      // no other thread is processing this key
> >> >>      try{
> >> >>          // process this key
> >> >>      } finally {
> >> >>         // done with processing this key
> >> >>         IN_PROGRESS.remove(key)
> >> >>      }
> >> >>    } else {
> >> >>      // some other thread is running this key, discard it
> >> >>    }
> >> >> }
> >> >>
> >> >> this works if I need to discard the request to process the key from
> >> >> thread t1 when another thread, t2, is processing that key.
> >> >>
> >> >> I need help to do following-
> >> >> make thread t1 wait while t2 is processing the key and resume t1 when
> >> >> t2 is finish processing same key.
> >> >>
> >> >> I'm aware that if there are multiple threads t1,t3,t4.. etc waiting
> >> >> for t2 to finish anyone of these thread can wake up and start
> >> >> processing the key irrespective of their order (if there is any) of
> >> >> asking to process the key.
> >> >>
> >> >> Thanks for help.
> >> >>
> >> >> Bheem
> >> >> _______________________________________________
> >> >> 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/20120531/e32a8dc7/attachment.html>


More information about the Concurrency-interest mailing list