【问题标题】:Understanding synchronized keyword on AdapterManagerImpl a class of sling framework了解AdapterManagerImpl类sling框架上的synchronized关键字
【发布时间】:2015-10-29 09:02:28
【问题描述】:

我正在研究 sling 框架在 sence 背后的工作原理。但是我对多线程编程的了解非常有限,无法理解他们在做什么,这是我的问题:

这是我正在处理AdapterManagerImpl.java 的类,在函数 registerAdapterFactory(第 247 行)上,他们在第 281 行定义了一个同步代码块:

        synchronized ( adfMap ) {
            adfMap.put(reference, factoryDesc);
        }

任何人都可以解释为什么adfMap 是共享资源并标记为同步?它对性能有何影响?

【问题讨论】:

  • 我不知道该框架,但似乎 afMap 可以被不同的线程同时访问或“使用”。所以你必须通过同步它来保护它免受并发修改。在同步块中,没有其他线程可以锁定它,因此它们必须等待。这当然会影响性能,但这在很大程度上取决于冲突的概率。同步行为本身也会带来额外的性能开销——不管发生多少冲突。
  • 代码 sn-p 没有标记 adfMap。这是一个同步的语句。它分三步执行:首先,adfMap 被锁定,然后大括号内的语句(或多个语句)被执行,然后 adfMap 被解锁。锁定一个对象的主要意义是不允许两个线程同时锁定同一个对象。
  • 同步语句使调用此代码的第一个线程获取锁对象(圆括号中的那个,此处为 adfMap)。现在没有其他线程可以获取这个锁(因为使用了一个锁对象标识),直到第一个线程不再持有它。 JVM 阻止任何没有持有锁的线程调用被锁保护的代码。因此,在释放锁之前,没有其他线程可以调用受此锁保护的代码。但是,如果锁指向不同的对象,另一个线程可能会调用相同的代码(例如在类的另一个实例上)。

标签: java multithreading synchronization sling


【解决方案1】:

adfMap

用作锁。

synchronized ( adfMap ) { ... }

意味着没有两个线程可以同时调用由这个锁保护的任何代码。如此简单 - 很容易弄错:-)。

非正式解释: 当这个锁也被用作另一个类中的锁时,这也会影响这些其他类的相应实例。

当此锁是 AdapterManagerImpl 中的私有静态成员时,这意味着没有两个线程可以同时进入任何 AdapterManagerImpl 实例上由此锁保护的任何代码。

更正式的解释: 锁守卫可防止由它保护的所有代码段同时由两个不同的线程进入(同一个线程可以多次进入代码 -> 同步是可重入的)。锁是一个对象,它守护着所有被这个锁对象(对象标识)保护的代码段。如果代码中某处有另一个同名的锁变量,这完全独立于第一个锁。

【讨论】:

  • 您没有足够的信息来支持该声明。如果表达式adfMap 为不同的线程产生不同的对象引用,则两个或多个线程可以同时执行花括号中的代码。例如,如果同步块出现在实例方法中,而adfMap 是实例变量。
  • @james large:我解决了这个问题(通过“静态成员”),但以一种令人困惑的方式。下次请仔细阅读答案。改进的解释。但是不要忘记 OP 声称对线程只有很少的了解 - 所以你应该避免解释太复杂以至于对他没有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
相关资源
最近更新 更多