Java中的锁定对象是否需要是静态的?

时间:2010-01-25 01:59:47

标签: java multithreading

我知道在C#中你有一个想要用作多线程锁的对象时,你应该在类中声明它是静态的,类实例将在一个单独的线程中运行。

这对Java也适用吗?在线的一些例子似乎将锁定对象声明为最终......

编辑: 我有一个资源,我想限制一次只有一个线程访问。扩展Thread的类将用于创建多个实例并同时启动。我该怎么用?

感谢。

3 个答案:

答案 0 :(得分:6)

取决于使用它们的上下文。如果您想要按实例锁定,请离开static。如果您想要每类锁定,请使用static。确实保持final

答案 1 :(得分:4)

简单回答,没有。答案很长,这取决于你想要什么。

private static final Object STATIC_LOCK = new Object();

private final Object lock = new Object();

public void doSomething() {
    synchronized (STATIC_LOCK) {
        // At most, one thread can enter this portion
    }

    synchronized (lock) {
        // Many threads can be here at once, but only one per object of the class
    }
}

话虽如此,我建议您查看java.util.concurrent.locks中提供的锁。使用java.util.concurrent.locks.Lock,您可以执行以下操作:

Lock l = ...;
l.lock();
try {
    // access the resource protected by this lock
} finally {
    l.unlock();
}  

答案 2 :(得分:2)

在Java中,可以使用非静态成员作为锁。

private Object lock = new Object();

public void test(){
    synchronized (lock) {
      // your code  
    }
}