[concurrency-interest] synchronization based on a key

bhm bheem at sbcglobal.net
Thu May 31 11:30:53 EDT 2012


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
>
>



More information about the Concurrency-interest mailing list