【发布时间】:2017-02-01 01:18:34
【问题描述】:
考虑以下代码在 JAVA 8 中使用 synchronized 关键字实现双重检查锁定:
private static void redoHeavyInitialisation() {
if (needToReinitialise()) {
synchronized (MyClass.class) {
if (needToReinitialise()) {
doHeavyInitialisation();
}
}
}
}
使用双重检查锁定的原因是因为初始化很繁重(因此很懒)并且它可能发生多次(因此不能使用单例模式,如果我错了,请纠正我)。
无论如何,首先,如何将上面的代码转换为使用 JAVA 并发包中的Lock 而不是使用同步关键字?
仅在此之后 AND 可选,随意评论使用 Lock 或 synchronized 关键字哪个更好。
请记住,这个问题与 Lock 与同步比较无关。没有回答代码转换部分的回答将不会被选为接受的答案。
【问题讨论】:
-
@ErwinBolwidt 是的,如果您只关注比较并且完全忽略这个要求等效代码转换的问题,这是主要问题。不想评论的可以不用评论,但请回答代码转换。
-
你可以使用单例。一种可能的架构是使用同步方法创建一个 Singleton HeavyInitializer 类来初始化和重做初始化。
-
@Chocksmith 我不知道使用单例进行重新初始化的方法,因为我知道的所有单例模式都依赖于单例实例的非并发初始化。在创建第一个也是唯一一个实例后如何重新触发?
-
你不应该和那些试图帮助你的人说话,好像他们是在替你做家庭作业的仆人一样。
标签: java multithreading concurrency java.util.concurrent double-checked-locking