如果将synchronized
关键字添加到 reloadAllCaches() 函数,则在 reloadAllCaches() 函数运行时,类中获得该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
. 此类将允许任意数量的函数同时获得读锁,但只有一个函数获得写锁。只有在没有读锁到位时才会获取写锁,只要有写锁就不会获取读锁。
你可以让你的重载函数获取一个写锁,而你的所有读取函数都获取一个写锁。您必须使用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();
}
}
}