据我了解,以下代码效率不高:
class Foo {
static Resource resource1;
static Resource resource2;
static synchronized void methodA() {
resource1.add("abc");
}
static synchronized void methodB() {
resource2.add("abc");
}
}
据我所知,这两种方法都锁定在单个对象(类对象 Foo.class
)中,所以我猜以下是一个很好的优化?
class Foo {
static Resource resource1;
static Resource resource2;
static void methodA() {
synchronized(resource1) {
resource1.add("abc");
}
}
static void methodB() {
synchronized(resource2) {
resource2.add("123");
}
}
}
只要两个资源互不依赖即可。
什么时候应该考虑使用静态同步方法?
最佳答案
当您的类抽象访问单个 critical resource 时,使用 static synchronized
构造, 因此锁定类在语义上是正确的。
如果您的类抽象了对多个关键资源的访问权限,那么您必须使用更精细的锁定,如您的示例所示。
您可以将方法的 synchronized
修饰符视为语法糖,除了锁定类(如果方法不是静态的,则锁定实例)之外没有额外的黑魔法。
在您的第一个示例中,如果它们完全不相关,为什么单个类提供对两个不同关键资源的访问是有问题的。或许您可以将关键部分移至 Resource 类本身。
关于java - 我应该尽量避免使用静态同步方法吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36768762/