Java 使方法也同步后发生并发问题

Java 使方法也同步后发生并发问题,java,web-services,concurrency,Java,Web Services,Concurrency,我在Web服务中有一个方法,它正在执行一些数据库插入。我想要对该方法的单一访问,这就是为什么我将一个方法设置为同步的。但当在同一时刻多次调用此方法时,同步选项不起作用。 该方法的结构如下所示 public synchronized void display() { //DataBase updations and Transactions. } 任何人都可以提出任何解决方案来避免此问题。问题不在于此方法,而在于包含此方法的代码的多个实例。如何确定同步不起作用?您知道同步是在对象级

我在Web服务中有一个方法,它正在执行一些数据库插入。我想要对该方法的单一访问,这就是为什么我将一个方法设置为同步的。但当在同一时刻多次调用此方法时,同步选项不起作用。 该方法的结构如下所示

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

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

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

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

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


干杯,

你能试一下吗-

  • 创建一个单独的类,该类处理所有数据库操作,如-insert、delete、createtable等

  • 使所有方法同步

  • 这个类应该在代码中初始化一次

  • 从该类外部创建数据库连接,并设置与该类的连接(该setter方法必须同步)。请记住,应该在上面处理数据库的类的类似代码的对象中创建一次连接

  • 然后在多个线程中使用该类的同一对象。这应该是可行的


  • “但当多个线程在同一瞬间调用此方法时,同步选项不起作用”是什么意思?你是怎么检查这个的?是的…这个同步只有在他使用那个类的单例实例时才会起作用。实际上,在这个方法中发生了一个插入操作。我希望它能以单次访问的方式执行。但是现在发生的事情是,多个具有相同数据的调用试图插入数据库中,这就是为什么我必须使这个方法同步。由于synchronized在我的示例中不起作用,所以两个线程都进入了该方法并同时尝试插入,这导致了约束冲突错误的形式。我不能通过不降低性能来锁定表,因为它在其他地方也被引用。那么,即使两个插入被序列化,您也不会得到约束冲突吗?提示:是的,你会的。您需要重新考虑您的体系结构。如果条目在数据库中存在或不存在,则会进行检查。。问题是,当两个线程都通过时,检查数据库中是否有条目,在这两个线程都通过该条件之后,是否发生了insert。我希望它能以单次访问的方式执行。但是现在发生的事情是,多个具有相同数据的调用试图插入db内部(我已经进行了检查,检查数据是否已准备就绪),这就是为什么我必须使此方法同步。由于同步在我的情况下不起作用,两个线程都进入了方法并同时尝试插入,这导致了约束冲突错误的形式。@Naman我已经更新了我的答案,请检查并让我知道。