什么做正式参数同步吗?

时间:2015-10-20 09:36:38

标签: java multithreading synchronized

我正在阅读netty源代码,并在形式参数上遇到<input type="text" id="text1" name="text1" value="text1value" /> <input type="text" id="text2" name="text2" /> <input type="text" id="text3" name="text3" /> <input type="text" id="text4" name="text4" value="text4value" />

synchronized

AbstractBootstrap(AbstractBootstrap<B, C> bootstrap) { localAddress = bootstrap.localAddress; synchronized (bootstrap.options) { options.putAll(bootstrap.options); } } 不是localAddress,因为它被声明为易变,对其他线程的任何更改都是可见的。

但我对synchronized的正式参数synchronized并不了解。

bootstrap是一个形式参数,每个帖子都有自己的副本。 bootstrap只影响它自己的线程?这个意见是否正确?

synchronized是为了防止在此类之外修改synchronized (bootstrap.options),还是阻止其他线程修改bootstrap.options

3 个答案:

答案 0 :(得分:2)

  

bootstrap是一个形式参数,每个线程都有自己的副本。同步它只影响它自己的线程?这个意见是否正确?

不,这不是严格正确的。参数bootstrap包含对象的引用,它不是对象的本地副本。因此,其他线程可以拥有自己对该对象的同一实例的引用。

  

synchronized(bootstrap.options)是为了防止在这个类之外修改bootstrap.options或者阻止this.options被其他线程修改?

有点儿。它将阻塞,直到当前线程可以获得对bootstrap.options中对象的独占访问权。它似乎是这样做的,因为bootstrap.options是某种本身不是线程安全的集合,因此它在并发使用时保护了地图的行为。

答案 1 :(得分:0)

每个构造函数调用都会收到指向AbstractBootstrap实例的引用变量的副本。

如果在构造函数中引用另一个实例,则更改将仅影响构造函数接收的副本。但AbstractBootstrap实例中的任何更改都将反映到共享它的所有线程。

希望它有所帮助,

答案 2 :(得分:0)

最有可能的情况是,在合并选项时锁定引导选项(一些可变映射)就是这种情况。由于没有其他源代码,我可以推断出引导实例(作为参数传递)及其选项字段在不同线程之间共享。这就是需要同步的原因。