形式参数上的同步有什么作用?

what does synchronized on formal parameter do?

我正在阅读 netty 源代码,并在形式参数上遇到 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在这个class之外被修改还是为了防止this.options被其他线程修改?

bootstrap is a formal parameter, every thread has it's own copy. synchronized on it only effect it's own thread? Is this opinion correct?

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

synchronized (bootstrap.options) is to prevent bootstrap.options to be modified outsides this class or to prevent this.options to be modified by other thread?

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

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

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

希望对您有所帮助,

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