S1: Lookup for some input data
S2: IF not found SET IT
S3: INSERT DATA
S4: ELSE RETURN
内存中没有数据存储。 如果2个线程同时查找相同的输入数据,则查找在两种情况下均返回FALSE。然后两者都经历长SET阶段。最后,一个单例服务线程插入一个非同步的Insert方法。多线程逻辑状态
通过这种方式,虽然查找的目的是永远不让相同的数据两次,因为2个线程在同一个数据上工作,但它的目的没有解决。 HOw处理多线程程序中的这种情况?
取决于您选择愿意多少工作投入到这一点。最简单的解决方案是在一些最终的静态锁定对象上进行同步,如果查找是空的,那么在再次检查之后,在同步块内进行整个插入。其所谓的双重检查锁定 - https://en.wikipedia.org/wiki/Double-checked_locking – radai 2013-02-25 23:07:03
http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html – 2013-02-25 23:13:20
使用Double_checked_locking与最终静态对象,我发现相同类的两个实例相互停止。所以,这应该解决它。 – fortm 2013-02-25 23:49:43