Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java synchronized关键字似乎不起作用_Java_Multithreading_Postgresql_Synchronized - Fatal编程技术网

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添加了一个链接到关于锁定选择的文档。