这是一个非常简单的问题,但我无法理解它背后的想法:
Why
synchronized
cannot be assigned to Java variables?
它只能分配给方法和 block 。 我个人认为这将是对 Java 编程语言的一个非常巧妙的补充。
最佳答案
同步块(synchronized block)保护完整的代码块。方法上的同步保护方法的完整代码。在这两种情况下,synchronized 都引用它用作监视器的对象 - this
(或当前类对象)或指定的对象。
第一:对监视器对象的要求意味着同步字段不能是原始类型。
第二:synchronized on a field 应该做什么?
有两种可能的答案:
- 保护对引用本身异或的访问
- 保护对引用背后对象的访问。
选项一是先有鸡还是先有蛋的问题:为了保护访问权限,必须首先访问该字段。尝试在多处理器上以原子方式执行此操作可能很有趣。此外:如果访问是写入(即对象更改),则监视器将在第一个对象上,而第二个对象已安装......疯狂在这条路上。
方案二:看这段代码:
public class Foo {
public synchronized StringBuilder sb = ...;
public void doSomething1(){
StringBuilder sb = this.sb;
sb.append("foo");
}
public void doSomething2(){
this.sb.append("foo");
}
}
因为只有访问会受到保护,所以这两种方法都是一样的。第一个版本只是让它更清楚一点,append
调用本身不 protected 。
哦,我忘了:在这两种情况下,你只能使用同步的互斥 - wait
或 notify
东西将不可用 - 因为你不能附加任何部分代码到变量。
剩下的:
也许只是 AtomicReference
的快捷方式?
这是一个非常罕见的用例,更改语言本身并不是一个好的选择。
关于java - 为什么 `synchronized` 对于变量来说是非法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9283459/