Java多线程和MySQL同步
关于这个问题: 计数器int已同步,对executeQuery的函数调用未同步。 我得到的结果 柜台:1 来自MYSQL的行:1 柜台:2 来自MYSQL的行:1 柜台:3 来自MYSQL的行:1 MYSQL的预期输出->行:应与计数器相同 所有线程在第一个查询中同时运行。因此,它们得到相同的结果id。但是,它们为计数器迭代同步。对我来说,这是荒谬的。这种行为有记录吗?我怎样才能绕过它? Verifier.javaJava多线程和MySQL同步,java,mysql,multithreading,Java,Mysql,Multithreading,关于这个问题: 计数器int已同步,对executeQuery的函数调用未同步。 我得到的结果 柜台:1 来自MYSQL的行:1 柜台:2 来自MYSQL的行:1 柜台:3 来自MYSQL的行:1 MYSQL的预期输出->行:应与计数器相同 所有线程在第一个查询中同时运行。因此,它们得到相同的结果id。但是,它们为计数器迭代同步。对我来说,这是荒谬的。这种行为有记录吗?我怎样才能绕过它? Verifier.java public void run() { int id = 0; St
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();
}
编辑:
我看到问题了,你更新查询没有提交结果。您将在更新后提交,您将看到表计数也将更改
编辑2:OP说
MYSQL的预期输出->行:应与计数器相同
但在当前的代码中,这是无法实现的。以下是程序的逻辑:
的<0'
的所有行checked='1'获取的所有行。
的行,如果第一个线程提交行,则该行将始终为0
checked='0'
,而应该从线程计数[传递给验证器的i
值]中派生出来
编辑3:
这里有一个修正,当为每个线程创建新的数据库时,线程不会按顺序执行。以上几点仍然适用,但这将使实现预期结果更加困难。编辑:
我看到问题了,你更新查询没有提交结果。您将在更新后提交,您将看到表计数也将更改
编辑2:OP说
MYSQL的预期输出->行:应与计数器相同
但在当前的代码中,这是无法实现的。以下是程序的逻辑:
获取选中了的<0'
的所有行
线程将更新使用checked='1'获取的所有行。
第二个线程出现,它尝试查找选中了的行,如果第一个线程提交行,则该行将始终为0
为了实现这种行为,您不应该在查询中硬编码checked='0'
,而应该从线程计数[传递给验证器的i
值]中派生出来
编辑3:
这里有一个修正,当为每个线程创建新的数据库时,线程不会按顺序执行。以上几点仍然成立,但这将使实现预期结果更加困难。您的代码原样意味着更新查询、增量和sysout在3个不同的对象锁上同步,而不是1。您的代码原样意味着更新查询,增量和sysout在3个不同的对象锁上同步,而不是在1个对象锁上。计数器只是用来显示同步是否实际工作。我的主要问题是所有线程都获取相同的行,而不是连续的行。请澄清您所说的“更新后提交,您将看到表计数也将更改”是什么意思。如果“自动提交”设置为false,则仅执行查询不会提交结果。因此,要么将auto commit设置为true,要么显式提交。计数器仅用于显示sync实际工作。我的主要问题是所有线程都获取相同的行,而不是连续的行。请澄清您所说的“更新后提交,您将看到表计数也将更改”是什么意思。如果“自动提交”设置为false,则仅执行查询不会提交结果。因此,要么将auto commit设置为true,要么显式提交。
public class MySQL{
int counter=0;
....
}