gpt4 book ai didi

java - 为什么 `synchronized` 对于变量来说是非法的?

转载 作者:行者123 更新时间:2023-11-30 09:40:41 25 4
gpt4 key购买 nike

这是一个非常简单的问题,但我无法理解它背后的想法:

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 。

哦,我忘了:在这两种情况下,你只能使用同步的互斥 - waitnotify 东西将不可用 - 因为你不能附加任何部分代码到变量。

剩下的:

也许只是 AtomicReference 的快捷方式?

这是一个非常罕见的用例,更改语言本身并不是一个好的选择。

关于java - 为什么 `synchronized` 对于变量来说是非法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9283459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com