📄 sharedlock.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 + -