Java synchronized关键字似乎不起作用
我的要求是从数据库中的表中获取代码,并将其标记为已删除,这样就不会再次获取代码。我们注意到相同的代码被提取了两次。因此,我将方法同步如下:Java synchronized关键字似乎不起作用,java,multithreading,postgresql,synchronized,Java,Multithreading,Postgresql,Synchronized,我的要求是从数据库中的表中获取代码,并将其标记为已删除,这样就不会再次获取代码。我们注意到相同的代码被提取了两次。因此,我将方法同步如下: public synchronized String fetchCode(School school) { log.info("fetching code for school id : {}", school.getId()); //DB query to fetch the code (For a certain school id
public synchronized String fetchCode(School school) {
log.info("fetching code for school id : {}", school.getId());
//DB query to fetch the code (For a certain school id, there can be many codes and we need to use one at a time and delete it)
log.info("fetched code : {}", code);
//DB query to mark the code as deleted
return code;
}
调试时,我注意到日志连续打印第一个日志两次,然后打印第二个日志。两个日志中的代码都是相同的。因此,synchronized关键字似乎没有任何好处。有什么想法吗?我不打算触及其中的卡夫卡部分,因为尽管该项目在流媒体方面产生了巨大的影响,但同步只是必须完成的,而且同步从来都不是一件容易的事,无论并行化狂热者试图向您推销什么 如果要正确执行此操作,请将信号量锁定移动到尽可能靠近数据的位置。从数据库中获取要标记为已删除的记录时,请使用for update限定符。这将在DBMS中锁定这些记录,并阻止任何其他进程对这些记录发出select…for update。它还将阻止对这些记录进行更新或删除的任何其他进程
有关在select上指定锁的文档和示例可以在中找到。您是否有定义此方法的任何类的多个实例?来自文档:首先,在同一对象上对同步方法的两次调用不可能交错。那么我猜还有第二个对象?是的,有两个对象正在调用该方法。因此,卡夫卡主题选择了一条消息,并根据该消息执行此操作。当两条消息很快接连出现时,我们就面临这个问题。@Beko你能建议我如何实现我在这里想要做的事情吗?你需要在一个对象上同步。你能提供一个链接到任何一篇文章,在那里我可以找到关于你提到的“更新”策略的更多信息吗?@TAnna添加了一个链接到关于锁定选择的文档。