荒谬的Java MultiThreading和MySQL同步

时间:2013-11-15 04:08:57

标签: java mysql multithreading

与问题相关: 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;
....

}

1 个答案:

答案 0 :(得分:1)

编辑: 我看到了问题,你更新查询没有提交结果。你在更新后提交,你会看到表计数也会改变。

EDIT2:OP说

  

预期输出 - &gt;来自MYSQL的行:应该与计数器相同

但是使用当前代码无法实现。以下是程序的逻辑:

  1. 使用checked='0'获取所有行。
  2. 主题将更新使用checked='1'
  3. 获取的所有行
  4. 第二个线程来了,它试图找到checked='0'的行,如果第一个线程提交行,它将始终为0。
  5. 为了实现这种行为,您不应该在查询中硬编码checked='0',而应该从线程计数[传递给Verifier的i]派生

    EDIT3: 这里有一个更正,当为每个线程创建新database时,线程将不会按顺序执行。以上几点仍然适用,但这将使预期结果难以实现。