首页 文章

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

提问于
浏览
4

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

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

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

谢谢 .

3 回答

  • 6

    取决于它们将在何种上下文中使用 . 如果您想要按实例锁定,请将 static 留下 . 如果您想要每类锁定,请使用 static . 确实保持它 final .

  • 3

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

    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

    没有

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

    private Object lock = new Object();
    
    public void test(){
        synchronized (lock) {
          // your code  
        }
    }
    

相关问题