⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sharedlock.java

📁 Java的面向对象数据库系统的源代码
💻 JAVA
字号:
// You can redistribute this software and/or modify it under the terms of
// the Ozone Core License version 1 published by ozone-db.org.
//
// The original code and portions created by SMB are
// Copyright (C) 1997-@year@ by SMB GmbH. All rights reserved.
//
// $Id: SharedLock.java,v 1.4 2002/09/18 06:54:15 per_nyfelt Exp $

package org.ozoneDB.core;

import org.ozoneDB.DxLib.*;
import org.ozoneDB.util.LogWriter;


/**
 * This class implements a non-exclusive lock policy. Multiple transactions may
 * hold this lock.
 *
 *
 * @author <a href="http://www.softwarebuero.de/">SMB</a>
 * @version $Revision: 1.4 $Date: 2002/09/18 06:54:15 $
 */
public final class SharedLock extends AbstractLock {

    protected final static long serialVersionUID = 1;
    protected final static byte subSerialVersionUID = 1;

    private int level = LEVEL_NONE;

    private transient int prevLevel = LEVEL_NONE;

    /**
     * All transactions that hold this lock. Holds TransactionIDs.
     */
    public DxSet lockers;


    public SharedLock() {
        reset();
    }


    public synchronized void reset() {
        level = prevLevel = LEVEL_NONE;
        lockers = new DxHashSet( 8 );
    }


    public int tryAcquire( Transaction ta, int newLevel ) {
        if (false&&ta.env.logWriter.hasTarget( LogWriter.DEBUG3 )) {
            ta.env.logWriter.newEntry( this, "tryAcquire(): current:" + level + " new:" + newLevel, LogWriter.DEBUG3 );
        }
        synchronized (this) {
            int prevLevel = level( ta );
            lockers.add( ta.taID() );

            if (!lockers.contains( ta.taID() )) {
                throw new RuntimeException( "tryAcquire(): unable to add ta to lockers." );
            //ta.env.logWriter.newEntry (this, "tryAcquire(): unable to add ta to lockers.", LogWriter.WARN);
            }
            level = newLevel > level ? newLevel : level;
            return prevLevel;
        }
    }


    public void release( Transaction ta ) {
        if (false&&ta.env.logWriter.hasTarget( LogWriter.DEBUG3 )) {
            ta.env.logWriter.newEntry( this, "release()", LogWriter.DEBUG3 );
        }
        synchronized (this) {
            if (!lockers.remove( ta.taID )) {
                throw new RuntimeException( "release(): transaction does not hold the lock." );
            }
            if (lockers.isEmpty()) {
                level = LEVEL_NONE;
            }
            if (false&&ta.env.logWriter.hasTarget( LogWriter.DEBUG3 )) {
                ta.env.logWriter.newEntry( this, "release(): count=" + lockers.count() + ", level=" + level, LogWriter.DEBUG3 );
            }
        }
    }


    public boolean isAcquiredBy( Transaction ta ) {
        return lockers != null ? lockers.contains( ta.taID() ) : false;
    }


    public DxCollection lockerIDs() {
        return lockers != null ? lockers : new DxHashSet();
    }


    public int level( Transaction ta ) {
        if (ta != null) {
            return isAcquiredBy( ta ) ? level : LEVEL_NONE;
        } else {
            return level;
        }
    }


    public int previousLevel() {
        return prevLevel;
    }

    public boolean areMultipleLockersHoldingLocks() {
        return lockers.count()>=2;
    }


    public boolean hasChanged() {
        return level > prevLevel;
    }

    public String toString() {
        return "SharedLock[lockers="+lockers+"]";
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -