gpt4 book ai didi

Java线程与MYSQL的不解

转载 作者:行者123 更新时间:2023-11-29 04:45:16 25 4
gpt4 key购买 nike

我对 MySQL 和 java 线程的行为感到非常困惑。我将其声明为同步的,但我得到的结果是冲突的。这意味着不止一个线程正在同时访问同一个函数。此代码段位于可运行类中。MachineID 是线程 ID,按照它在 for 循环中被调用的顺序排列。 (它只是一个从 1 到 100 的数字)。

我认为该表不是必需的信息

这是我得到的输出

144 18

144 17

144 11

144 13

144 10

144 9

    public synchronized int getRow() throws SQLException{
String query="SELECT * FROM Searches WHERE checked='0'";
ResultSet results = this.database.executeQuery(query);
int id=0;
if(results.next()){
id=results.getInt(1);
System.out.println(id+" "+this.machineID);
query = "UPDATE Searches SET checked='1' WHERE ID_num='"+id+"'";
System.out.println(this.database.executeUpdate(query));
}

return id;
}
public void run() {



int id=getRow();

if (id!=0) {
}
}

这是我调用线程的地方

for (int i = 0; i < verifier.length; i++) {
verifier[i]=new Thread(new Verifier(main.database,i+1));
verifier[i].start();
}

最佳答案

假设 getRow() 方法属于 Verifier 类,则不会发生阻塞。当您在方法上声明 synchronized 时,它等同于在实例本身上进行同步。但是,您正在为每个 Thread 生成一个新的 Verifier 实例。它们中的每一个都在同步自己,因此没有一个会阻止其他任何一个。

考虑与 Verifier 的每个实例共享一个 Lock 对象或在共享对象上同步。

Object lock = new Object();

for (int i = 0; i < verifier.length; i++) {
verifier[i]=new Thread(new Verifier(main.database,i+1, lock));
verifier[i].start();
}

...
public int getRow() throws SQLException{
synchronized(lock) {
...
}
}

关于Java线程与MYSQL的不解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19992710/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com