我知道在C#中你有一个想要用作多线程锁的对象时,你应该在类中声明它是静态的,类实例将在一个单独的线程中运行。
这对Java也适用吗?在线的一些例子似乎将锁定对象声明为最终......
编辑: 我有一个资源,我想限制一次只有一个线程访问。扩展Thread的类将用于创建多个实例并同时启动。我该怎么用?
感谢。
答案 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
}
}