All Downloads are FREE. Search and download functionalities are using the official Maven repository.

nablarch.core.util.map.LockableMap Maven / Gradle / Ivy

package nablarch.core.util.map;

import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 排他ロックを内蔵したMapのラッパークラス。
 *
 * @param  キーの型
 * @param  値の型
 * 
 * @author Iwauo Tajima
 */
public class LockableMap extends MapWrapper implements Lock {
    /**
     * コンストラクタ。
     * @param baseMap ラップ対象のMap
     */
    public LockableMap(Map baseMap) {
        this(baseMap, new ReentrantLock());
    }
    
    /**
     * コンストラクタ
     * @param baseMap ラップ対象のMap
     * @param lock    ロックオブジェクト
     */
    public LockableMap(Map baseMap, ReentrantLock lock) {
        this.baseMap = baseMap;
        this.lock = lock;
    }
    
    @Override
    public Map getDelegateMap() {
        return baseMap;
    }
    /** ラップ対象のMap */
    private final Map baseMap;
    
    /** このインスタンスに対する排他ロック */
    private final ReentrantLock lock;
    
    /** {@inheritDoc} */
    public void unlock() {
        if (lock.isHeldByCurrentThread()) {
            lock.unlock();
        }
    }
    
    /** {@inheritDoc} */
    public void lock() {
        if (!lock.isHeldByCurrentThread() && active) {
            lock.lock();
        }
    }
    
    /**
     * 排他ロックを無効化する。
     * 以降、どのスレッドも新たなロックを獲得することはできない。
     * (開放は可能。)
     */
    public void deactivate() {
        unlock();
        active = false;
    }
    
    /**
     * 排他ロック機能が有効かどうか。
     */
    private boolean active = true;
    
    /** {@inheritDoc} */
    public void lockInterruptibly() throws InterruptedException {
        throw new UnsupportedOperationException(
        "ExclusiveAccessMap#lockInterruptibly has not supported yet."
        );
    }

    /** {@inheritDoc} */
    public Condition newCondition() {
        throw new UnsupportedOperationException(
        "ExclusiveAccessMap#newCondition has not supported yet."
        );
    }

    /** {@inheritDoc} */
    public boolean tryLock() {
        throw new UnsupportedOperationException(
        "ExclusiveAccessMap#tryLock has not supported yet."
        );
    }

    /** {@inheritDoc} */
    public boolean tryLock(long time, TimeUnit unit) {
        throw new UnsupportedOperationException(
        "ExclusiveAccessMap#tryLock has not supported yet."
        );
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy