「名前」でロックを制御する

オブジェクトに対してロックをかけるのではなく、「名前」(というか文字列)に対してロックをかける。違うインスタンスなんだけど同じ名前を持つオブジェクトに対してロックをかける場合に使う。

使い方

一般的なロックと同じ?でロック取得/解除時に対象となる文字列を引数に取る。

    NameLock lock = new NameLock();

    public void hoge(String name) {
        lock.lock(name);
        try {
            // do something.
        } finally {
           lock.unlock(name);
        }
    }

ある文字列に対してlock(String)を呼び出したとき、同じ文字列に対してlock(String)を呼び出すとそこでウエイトする。ロックした文字列に対してロックを解除するときすときは同じ文字列を用いてunlock(String)を呼び出す。

NameLock.java
import java.util.HashSet;
import java.util.Set;

public class NameLock {

    private Set<String> lockNameSet;

    public NameLock() {
        this(256);
    }
    
    public NameLock(int tableSize) {
        lockNameSet = new HashSet<String>(tableSize);
    }
    
    public void lock(String name) throws InterruptedException {
        synchronized (lockNameSet) {
            while (lockNameSet.contains(name)) {
                lockNameSet.wait();
            }
            lockNameSet.add(name);
        }
    }
    
    public void unlock(String name) {
        synchronized (lockNameSet) {
            lockNameSet.remove(name);
            lockNameSet.notifyAll();
        }
    }
}