java - 我应该尽量避免使用静态同步方法吗

标签 java

据我了解,以下代码效率不高:

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/

相关文章:

java - 2 个子类中有相同的 getter 和 setter..?

java - 为什么 Java 集合不删除通用方法?

java - Eclipse 内置 jar 导出选项与 Maven 程序集插件

java - Sublime Text 2 中 public static void main() 和 System.out.println() 的键绑定(bind)

java - 为什么 JScrollpane 没有添加到我的文本编辑器中的 JTextArea 中?

java - 计算原始操作和计算 Big-O 符号

java - 比较Hashmap下载excel中的数据

java - java是否只能通过代码创建表单及其控件?

Java while(true) 循环在线程内只执行一次

java - 如何解析具有多个字符实体的XML?