【问题标题】:Concurrency Issue occuring After making the method as synchronized also使方法同步后发生并发问题
【发布时间】:2012-10-19 11:21:43
【问题描述】:

我在 Web 服务中有一个方法,它正在执行一些数据库插入。我想要对该方法的单一访问,这就是我将方法设为同步的原因。但是,当在同一个即时同步选项中对该方法进行多次调用时,该选项不起作用。 方法的结构是这样的

public synchronized void display() {
   //DataBase updations and Transactions.    
}

任何人都可以提出任何可以避免此问题的解决方案。

【问题讨论】:

  • “但是当多个线程同时调用此方法时,同时同步选项不起作用”是什么意思?你是怎么检查这个的?

标签: java web-services concurrency


【解决方案1】:

问题不在于方法,而在于包含此方法的代码的多个实例。

【讨论】:

    【解决方案2】:

    您如何确定同步不起作用?您知道同步在 object 级别上起作用,因此如果该方法位于 servlet 中,并且 servlet 容器创建了该 servlet 的多个实例,那么您就不走运了 - 每个 servlet 实例都可以运行“同步”方法。

    另外,您为什么要在代码中序列化 DB 操作 - 任何 DB 都完全有能力做到这一点,参见。事务性和 ACID 原则。

    干杯,

    【讨论】:

    • 是的...只有当他使用该类的单例实例时,此同步才会起作用。
    • 其实这个方法内部发生了插入操作。我希望它通过单一访问执行。但是现在发生了什么,多个调用具有相同数据的尝试插入数据库中,这就是为什么我必须使这个方法同步。由于在我的情况下同步不起作用,因此两个线程都进入了该方法并同时尝试插入,这导致了约束违反错误的形式。而且我不能锁定表,因为它也被引用到其他地方,不会降低性能。
    • 好吧,如果两个插入被序列化,你不会得到约束冲突甚至吗?提示:是的,你会的。您需要重新考虑您的架构。
    • 很好地检查条目是否存在于数据库中。问题是当两个线程都通过时,检查条目是否存在于数据库中,然后两个线程都通过了那个条件。
    【解决方案3】:

    你可以试试关注吗-

    1. 创建一个单独的类来处理所有数据库操作,例如插入、删除、创建表等。

    2. 同步所有方法。

    3. 这个类应该在你的代码中初始化一次。

    4. 在该类外部创建一个数据库连接并将该连接设置为该类(此设置方法必须同步)。请记住,连接应该在您的代码中创建一次,例如处理数据库的上述类的对象。

    5. 然后在多个线程中使用这个类的同一个对象。那应该工作。

    【讨论】:

    • 嗨 Ashish 实际上在这个方法中发生了一个插入操作。我希望它通过单一访问执行。但是现在发生了什么,多个调用相同的数据试图插入到数据库中(我已经检查了数据是否已经存在)这就是为什么我必须使这个方法同步。由于在我的情况下同步不起作用,因此两个线程都进入了该方法并同时尝试插入,这导致了约束违反错误的形式。
    • @Naman 我已经更新了我的答案,请检查并告诉我。
    猜你喜欢
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多