为什么`synchronized`被变为非法变量?

时间:2012-02-14 20:06:34

标签: java variables synchronized

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

  

为什么synchronized无法分配给Java变量?

它只能分配给方法和块。 我个人认为这将是Java编程语言的一个非常简洁的补充。

4 个答案:

答案 0 :(得分:1)

他们拥有volatile关键字。

答案 1 :(得分:1)

同步块保护整个代码块。方法上的synchronized同步保护方法的完整代码。在这两种情况下,synchronized指的是它用作监视器的对象 - this(或当前类对象)或指定对象。

首先:监视器对象的要求意味着同步字段不能是基本类型。

第二:在一个字段上同步应该做什么?

有两种可能的答案:

  • 保护对引用本身的访问权限XOR
  • 保护对引用后面对象的访问。

选项一将是一个鸡蛋问题:为了保护访问,必须首先访问该字段。尝试在多处理器上以原子方式执行此操作可能很有趣。此外:如果访问是写入(即对象改变),那么监视器将在第一个对象上,而第二个对象被安装...疯狂就在这条路上。

选项二:看到这段代码:

public class Foo {
     public synchronized StringBuilder sb = ...;
     public void doSomething1(){
         StringBuilder sb = this.sb;
         sb.append("foo");
     }

     public void doSomething2(){
         this.sb.append("foo");
     }
}

由于只保护访问权限,因此两种方法都是相同的。 。第一个版本更清晰一些

哦,我忘记了:在这两种情况下,您只能使用同步的互斥 - appendwait内容不可用 - 因为您无法将任何代码段附加到变量中。

剩下的是什么:

也许只是notify的快捷方式?

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

答案 2 :(得分:0)

不会帮到你。您使用synchronized来使代码块成为原子。因此,大多数情况下,您需要同步多行代码。

答案 3 :(得分:0)

如果您正在寻找原子行为的字段,请尝试java.util.concurrent.atomic类。例如,AtomicInteger允许您以原子方式向其添加数字。如果对象分配是一个问题,并且您确定需要它,AtomicIntegerFieldUpdater<T>(及其同类)可以为您提供类似原子的volatile字段访问权限 - 但您必须小心这一点,因为使用这种方法很容易破坏你的代码。