【问题标题】:How to lock(sync) a static class?如何锁定(同步)静态类?
【发布时间】:2010-02-24 08:54:02
【问题描述】:

我正在创建一个静态类,它将保存一些带有信息的向量。 我必须使其同步,以便在有人编辑或读取向量时锁定课程。

最好的方法是什么?

有一个像这样在类内部同步的函数是否足够:

public synchronized insertIntoVector(int id)
{

}

提前致谢:)

【问题讨论】:

    标签: java class static synchronized


    【解决方案1】:

    首先,您需要准确定义“静态类”的含义。起初,我以为您的意思是所有方法都是静态的(不打算实例化)的类 - 但您的代码 sn-p 暗示情况并非如此。

    在任何情况下,类中的同步方法如果是实例方法则等价于synchronized(this),如果是静态方法则等价于synchronized(TheContainingClassName.class)

    如果您正在创建一个包含所有静态方法的不可实例化类,或者如果您正在创建一个将充当单例的类,那么同步该类的每个方法将确保只有一个线程可以在一次。

    如果可能,请尽量确保您的方法是原子的;对不同方法的调用可以由其他线程交错,因此如果另一个线程调用setFoo(),则类似getFoo() 调用后跟setFoo()(可能在增加 foo 变量之后)可能不会产生预期的效果。最好的方法是使用诸如incrementFoo() 之类的方法;或者(如果这不可能)您可以发布同步详细信息,以便您的调用者可以在整个调用序列期间手动锁定类/实例。

    【讨论】:

    • 我想要的是一个不应该被实例化的类。但是当使用某些功能时,应该锁定整个类。
    • Andrzej Doyle 假设你想说的话似乎是对的。结论:同步静态方法就足够了,因为它们都与 YourClass.class 同步。还要小心你在方法中的代码!!
    • 补充一点:如果你只在同步的方法中访问向量,你可以使用 ArrayList 而不是 Vector。您之前的同步将防止不同步的访问,因此您不需要 Vector 完成的额外同步
    • 感谢@Hardcoded 提供的其他信息,现在更改为 ArrayList :)
    【解决方案2】:

    AFAIK,Java 中没有“静态类”之类的东西。你的意思是一个只包含静态方法的类吗?如果是的话,那么

    public static synchronized void insertIntoVector(int id) {
    
    }
    

    相对于类对象同步,如果只有静态方法并且所有方法都同步,这就足够了。

    如果您的意思是静态内部类(其中“静态”一词的含义与静态方法中的不同),那么

    public synchronized void insertIntoVector(int id)
    {
    
    }
    

    相对于该静态内部类的实例进行同步。

    【讨论】:

      猜你喜欢
      • 2010-10-01
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      • 1970-01-01
      • 2012-05-01
      相关资源
      最近更新 更多