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

标签 java variables synchronized

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

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/

相关文章:

java - 在 Eclipse 上调试 CGLIB FastClass 时出错

java - 我正在尝试使用图形并绘制一些矩形

java - maven编译失败。无法访问

javascript - 使用变量将 jQuery 处理程序分配给多个 DIV

c - 为什么我在c语言中使用任何字符的int变量进行scanf,并使用%d进行printf,它必须显示2?

c# - .net 使用什么哈希算法? java呢?

c++ - 如何在单行语句中减少 C++ 中的多个变量?

java - 账户之间的多线程银行转账

java - synchronized 方法到底做了什么?

java方法同步对象