【发布时间】: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