Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

A Useful StripedLock from GridGain

DZone's Guide to

A Useful StripedLock from GridGain

· Big Data Zone
Free Resource

Effortlessly power IoT, predictive analytics, and machine learning applications with an elastic, resilient data infrastructure. Learn how with Mesosphere DC/OS.

A pretty cool locking mechanism which we use every now and then at  GridGain is concurrent segmented "striped" locks. Sometimes, your objects are constantly recreated, so you can't really attach a mutex to them. For cases like those you can partition the object space into multiple segments (often by object hashcode value) and only acquire the lock on the segment an object belongs to. This way the more segments you have, the more concurrency you have.

Here is a code for our StripedLock that I thought would be good to share:
 
public class StripedLock {
    // Array of underlying locks.
    private final Lock[] locks;
 
    public StripedLock(int concurrencyLevel) {
        locks = new Lock[concurrencyLevel];
 
        for (int i = 0; i < concurrencyLevel; i++)
            locks[i] = new ReentrantLock();
    }
 
    public int concurrencyLevel() {
        return locks.length;
    }
 
    public Lock getLock(int key) {
        return locks[abs(key) % locks.length];
    }
 
    public Lock getLock(long key) {
        return locks[abs((int)(key % locks.length))];
    }
 
    // Account for Math.abs() returning negative value.
    private int abs(int key) {
        return key == Integer.MIN_VALUE ? 0 : Math.abs(key);
    }
 
    public Lock getLock(@Nullable Object o) {
        return o == null ? locks[0] : getLock(o.hashCode());
    }
 
    public void lock(int key) {
        getLock(key).lock();
    }
 
    public void lock(long key) {
        getLock(key).lock();
    }
 
    public void unlock(int key) {
        getLock(key).unlock();
    }
 
    public void unlock(long key) {
        getLock(key).unlock();
    }
 
    public void lock(@Nullable Object o) {
        getLock(o).lock();
    }
 
    public void unlock(@Nullable Object o) {
        getLock(o).unlock();
    }
}
 

Learn to design and build better data-rich applications with this free eBook from O’Reilly. Brought to you by Mesosphere DC/OS.

Topics:

Published at DZone with permission of Eric Genesky. See the original article here.

Opinions expressed by DZone contributors are their own.

THE DZONE NEWSLETTER

Dev Resources & Solutions Straight to Your Inbox

Thanks for subscribing!

Awesome! Check your inbox to verify your email so you can start receiving the latest in tech news and resources.

X

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}