このキーワードをreloadAllCaches()関数に追加すると、reloadAllCaches()関数の実行中はsynchronized
、キーワードを取得したクラス内の他のすべての静的関数を実行できなくなります。synchronized
synchronized
キーワードを取得したかどうかに関係なく、非静的関数を実行できる方法。synchronized
また、キーワードのない他のすべての関数を実行できます。
結局のところ、を備えた関数は次のsynchronized
ように見ることができます:
public class Bar
{
public static void foo()
{
synchronized (Bar.class)
{
// your code
}
}
}
synchronized
キーワードを使用した非静的関数は、次のように表示されます。
public class Bar
{
public void foo()
{
synchronized (this)
{
// your code
}
}
}
したがって、静的関数と非静的関数は異なる同期コンテキストを持ち、synchronizedキーワードを使用して相互の実行をブロックしません。
あなたの場合、私はの使用法を提案しますReentrantReadWriteLock
。このクラスでは、任意の数の関数が同時に読み取りロックを取得できますが、書き込みロックを取得できるのは1つの関数のみです。書き込みロックは、読み取りロックが設定されていない場合にのみ取得され、書き込みロックが設定されている限り、読み取りロックは取得されません。
リロード関数に書き込みロックをフェッチさせ、すべての読み取り関数に書き込みロックをフェッチさせることができます。ofcauseの静的インスタンスを使用する必要がReentrantReadWriteLock
あります。
私の提案は、次のように実装することです。
public class CacheHelper
{
private static HashMap foos, bars;
private static java.util.concurrent.locks.ReadWriteLock lock = new java.util.concurrent.locks.ReentrantReadWriteLock();
public static Foo getFoo(int fooId)
{
lock.readLock().lock();
try {
/* etc etc */
} finally {
lock.readLock().unlock();
}
}
public static Bar getBar(int barId)
{
lock.readLock().lock();
try {
/* etc etc */
} finally {
lock.readLock().unlock();
}
}
public static void reloadAllCaches()
{
lock.writeLock().lock();
try {
//This is where I need it to lock access to all the other static methods
} finally {
lock.writeLock().unlock();
}
}
}