Java 多线程逻辑情况

Java 多线程逻辑情况,java,multithreading,Java,Multithreading,最初没有存储任何数据。 若两个线程同时查找相同的输入数据,则在这两种情况下,查找都返回FALSE。然后这两个线程都经过长设置阶段。最后,单例服务线程在非同步插入方法中插入条目 通过这种方式,尽管查找的目的是永远不会让相同的数据丢失两次,但由于两个线程处理相同的数据,它的目的并没有得到解决。如何在多线程程序中处理这种情况?如果您使用的是数据库,那么您一直在寻找的关键字是 如果是普通编码,您可能需要或可能需要 如果您能澄清您的问题,或许我们可以进一步提供帮助。双重检查锁定应用: S1: Lookup

最初没有存储任何数据。 若两个线程同时查找相同的输入数据,则在这两种情况下,查找都返回FALSE。然后这两个线程都经过长设置阶段。最后,单例服务线程在非同步插入方法中插入条目


通过这种方式,尽管查找的目的是永远不会让相同的数据丢失两次,但由于两个线程处理相同的数据,它的目的并没有得到解决。如何在多线程程序中处理这种情况?

如果您使用的是数据库,那么您一直在寻找的关键字是

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


如果您能澄清您的问题,或许我们可以进一步提供帮助。

双重检查锁定应用:

S1: Lookup for some input data
S2:  IF not found SET IT
S3:  INSERT DATA
S4:  ELSE RETURN

这取决于你愿意为此付出多少努力。最简单的解决方案是,如果查找为空,则在某个最终静态锁对象上进行同步,然后在再次检查后,在同步块内执行整个插入。它被称为双重检查锁定——对最后一个静态对象使用双重检查锁定,我发现相同类的两个实例彼此停止。所以,这应该可以解决这个问题。@radai,我应该有多个静态最终锁定对象,因为如果所有方法都使用同一个对象作为锁定对象,我不希望不同的方法彼此锁定。@fortm-这取决于你想投入的工作量-使用单个锁定最简单,但是,关心不同密钥的进程会相互阻塞。按键使用锁的映射将允许更多线程同时运行,但在我的例子中,这比数据库更复杂。在查找中有一个select查询,Insert类是一个单例DAO。条件检查是从一个扩展线程的类进行的,该类在任何时候都有不同的实例在运行。。因此,很有可能在同一时间为每个人提供相同的数据。UPSERT也是一个很好的选择。谢谢你的建议。我需要探索如何使用SpringJDBCforOracle编写这样的语句。到目前为止,这是一个简单的插入
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