答えは簡単です...この問題は2つのクラスで管理できます。
各クラスの特徴は以下のとおりです。
ReportUtil:
(1)書き込みモードで開いているレポートがあるかどうかを追跡します
(2)使用可能なアクセスモードに基づいてレポートのオブジェクトを作成します
レポート:
(1)与えられたアクセスに基づいて読み取り専用または書き込み可能なレポートを開きます
(2)現在のレポートが書き込みモードで開いていた場合は、閉じている間にReportUtilクラスのフラグをリセットします。
クライアント:
ReportUtilクラスとReportクラスをテストします。
import java.util.LinkedList;
public class ReportUtil {
private static boolean bIsWriteLockAvaialable = true;
public static synchronized Report getReport() {
Report reportObj = new Report(bIsWriteLockAvaialable);
if(true == bIsWriteLockAvaialable) {
bIsWriteLockAvaialable = false;
}
return reportObj;
}
public static void resetLock() {
bIsWriteLockAvaialable = true;
}
}
public class Report {
private boolean bICanWrite = false;
public Report(boolean WriteAccess) {
bICanWrite = WriteAccess;
}
public void open() {
if(bICanWrite == true) {
//Open in write mode
System.out.println("Report open in Write mode");
}
else {
//Open in readonly mode
System.out.println("Report open in Read only mode");
}
}
public synchronized void close() {
if(bICanWrite == true) {
ReportUtil.resetLock();
}
}
}
public class Client {
public static void main(String[] args) {
Report report1 = ReportUtil.getReport();
report1.open(); //First time open in writable mode
Report report2 = ReportUtil.getReport();
report2.open(); //Opens in readonly mode
Report report3 = ReportUtil.getReport();
report3.open(); //Opens in readonly mode
report1.close(); //close the write mode
Report report4 = ReportUtil.getReport();
report4.open(); //Opens in writable mode since the first writeable report was closed
}
}
出力:書き込みモードで開いているレポート読み取り専用モードで開いているレポート読み取り専用モードで開いているレポート書き込みモードで開いているレポート
ここでハッシュテーブルを使用する理由がわかりません。私はあなたの要件を理解していなかったのかもしれません。また、同期の問題を回避するために同期メソッドを使用しました。
レポートを使用しているすべてのユーザーを追跡する必要がある場合は、お知らせください。
ハッピーラーニング!!!