2013-02-25 102 views
0
S1: Lookup for some input data 
S2: IF not found SET IT 
S3: INSERT DATA 
S4: ELSE RETURN 

内存中没有数据存储。 如果2个线程同时查找相同的输入数据,则查找在两种情况下均返回FALSE。然后两者都经历长SET阶段。最后,一个单例服务线程插入一个非同步的Insert方法。多线程逻辑状态

通过这种方式,虽然查找的目的是永远不让相同的数据两次,因为2个线程在同一个数据上工作,但它的目的没有解决。 HOw处理多线程程序中的这种情况?

+0

取决于您选择愿意多少工作投入到这一点。最简单的解决方案是在一些最终的静态锁定对象上进行同步,如果查找是空的,那么在再次检查之后,在同步块内进行整个插入。其所谓的双重检查锁定 - https://en.wikipedia.org/wiki/Double-checked_locking – radai 2013-02-25 23:07:03

+0

http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html – 2013-02-25 23:13:20

+0

使用Double_checked_locking与最终静态对象,我发现相同类的两个实例相互停止。所以,这应该解决它。 – fortm 2013-02-25 23:49:43

回答

0

双重检查锁定应用:

S1: Lookup for some input data 
S2: IF not found { 
     synchronized(getClass()) { 
S2-1: Lookup for some input data 
S2-2: IF not found 
S2-3: INSERT DATA 
     } 
S3: RETURN result of S1, S2-1, or S2-3 
1

如果您使用的是数据库,那么您所寻找的关键字是upsert

如果是普通编码,您可能需要atomics或者synchronization

如果你能澄清你的问题,也许我们可以进一步帮助。

+0

它是数据库在我的情况。在lookup中有一个select查询,Insert类是一个Singleton DAO。条件检查发生在扩展THread的类中,并且在任何时候都有不同的实例运行。所以有可能出现这种情况,同一个数据可能会同时发生。 – fortm 2013-02-25 23:16:57

+0

UPSERT也是一个很好的选择。感谢提示这一点。我需要研究如何使用Spring JDBC for Oracle编写这样的语句。到目前为止,这是一个普通的INSERT – fortm 2013-02-26 17:53:11

+0

http://stackoverflow.com/questions/2104206/spring-jdbc-query-execution – fortm 2013-02-26 17:58:41