【发布时间】:2015-07-07 18:31:54
【问题描述】:
我有一个关于 Java 并发的问题。如果我基于一个对象同步一个临界区,那么将该变量声明为 final static Object 与简单地声明为 final Object 有什么区别。
我知道static 关键字将一个变量定义为属于该类,但我对它在多线程环境中的含义有点模糊。
请参考下面的代码示例。目前我将lock 对象声明为private final Object lock = new Object(),如果我添加static 关键字会有什么不同?
class ConcurrencySample {
private String message = null;
private final Object lock = new Object();
//private final static Object lock = new Object();
public void setMessage(String msg) {
synchronized (lock) {
message = msg;
}
}
public String getMessage() {
synchronized (lock) {
String temp = message;
message = null;
return temp;
}
}
}
感谢您的帮助!
【问题讨论】:
-
没什么特别的意思,就是你说的。如果您将
lock声明为static,它将由该类的所有实例共享,因此对任何实例的setMessage()/getMessage()调用将阻止所有其他实例。看到你操作的message字段不是static,锁也没有理由应该是static。
标签: java multithreading concurrency static synchronized