与问题相关: Java Threading with MYSQL puzzled
计数器int,是同步的,函数调用executeQuery不同步。 我得到的结果
计数器:1
来自MYSQL的行:1
计数器:2
来自MYSQL的行:1
计数器:3 来自MYSQL的行:1
预期输出 - >来自MYSQL的行:应该与计数器相同
所有线程在第一个查询的同时运行。因此,他们获得了相同的结果ID。然而,它们为计数器迭代同步。对我来说,这是荒谬的。这种行为是否有记录?我怎么能绕过它呢? Verifier.java
public void run() {
int id = 0;
String query = "SELECT ID_num FROM Searches WHERE checked='0'";
ResultSet results;
synchronized (this.database) {
results = this.database.executeQuery(query);
if (results.next()) {
id = results.getInt(1);
query = "UPDATE Searches SET checked='1' WHERE ID_num='"
+ id + "'";
this.database.counter++;
System.out.println(this.database.counter);
System.out.println(id);
}
}
}
Core.java
for (int i = 0; i < verifier.length; i++) {
MySQL database=new MySQL();
verifier[i]=new Thread(new Verifier(database,i+1));
verifier[i].start();
}
MySQL.java
public class MySQL{
int counter=0;
....
}
答案 0 :(得分:1)
编辑: 我看到了问题,你更新查询没有提交结果。你在更新后提交,你会看到表计数也会改变。
EDIT2:OP说
预期输出 - &gt;来自MYSQL的行:应该与计数器相同
但是使用当前代码无法实现。以下是程序的逻辑:
checked='0'
获取所有行。checked='1'
checked='0'
的行,如果第一个线程提交行,它将始终为0。为了实现这种行为,您不应该在查询中硬编码checked='0'
,而应该从线程计数[传递给Verifier的i
]派生
EDIT3:
这里有一个更正,当为每个线程创建新database
时,线程将不会按顺序执行。以上几点仍然适用,但这将使预期结果难以实现。