这是一个非常简单的问题,但我无法理解它背后的想法:
为什么
synchronized
无法分配给Java变量?
它只能分配给方法和块。 我个人认为这将是Java编程语言的一个非常简洁的补充。
答案 0 :(得分:1)
他们拥有volatile关键字。
答案 1 :(得分:1)
同步块保护整个代码块。方法上的synchronized同步保护方法的完整代码。在这两种情况下,synchronized指的是它用作监视器的对象 - this
(或当前类对象)或指定对象。
首先:监视器对象的要求意味着同步字段不能是基本类型。
第二:在一个字段上同步应该做什么?
有两种可能的答案:
选项一将是一个鸡蛋问题:为了保护访问,必须首先访问该字段。尝试在多处理器上以原子方式执行此操作可能很有趣。此外:如果访问是写入(即对象改变),那么监视器将在第一个对象上,而第二个对象被安装...疯狂就在这条路上。
选项二:看到这段代码:
public class Foo {
public synchronized StringBuilder sb = ...;
public void doSomething1(){
StringBuilder sb = this.sb;
sb.append("foo");
}
public void doSomething2(){
this.sb.append("foo");
}
}
由于只保护访问权限,因此两种方法都是相同的。 1}}调用本身不受保护。
。第一个版本更清晰一些哦,我忘记了:在这两种情况下,您只能使用同步的互斥 - append
或wait
内容不可用 - 因为您无法将任何代码段附加到变量中。
剩下的是什么:
也许只是notify
的快捷方式?
这是一个非常罕见的用例,改变语言本身并不是一个好的选择。
答案 2 :(得分:0)
不会帮到你。您使用synchronized来使代码块成为原子。因此,大多数情况下,您需要同步多行代码。
答案 3 :(得分:0)
如果您正在寻找原子行为的字段,请尝试java.util.concurrent.atomic
类。例如,AtomicInteger
允许您以原子方式向其添加数字。如果对象分配是一个问题,并且您确定需要它,AtomicIntegerFieldUpdater<T>
(及其同类)可以为您提供类似原子的volatile
字段访问权限 - 但您必须小心这一点,因为使用这种方法很容易破坏你的代码。