1

我对 MySQL 和 java 线程的行为感到非常困惑。我声明这是同步的,我得到的结果是冲突的。这意味着多个线程同时访问同一个函数。此代码段位于可运行类中。MachineID 是按照在 for 循环中调用它的顺序的线程 ID。(它只是一个从 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();
    }
4

3 回答 3

4

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

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

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) {
        ...
    }
}
于 2013-11-15T03:02:47.657 回答
0

索蒂里奥斯一针见血。但是,我不会使用一个新变量来锁定,而是只使用一个Verifier,并从多个线程中调用它。所以你会有

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

注意 - 我不知道Verifier构造函数的第二个参数应该是什么。很有可能,您实际上并不需要它,但由于您实际上并没有显示构造函数,所以我想我会把它留在里面。

于 2013-11-15T03:13:46.497 回答
0

根本没有同步发生,它类似于

synchronize(this) 

并且同一实例不会在线程之间共享,因此根本不会发生同步。因此,您需要在Runnable实例之间共享一个锁对象,即Verifier在构造函数中,例如:

public class Verifier implements Runnable{
    private final Object lock;
    public Verifier(Object lock){
         this.lock=lock;
    }

比你可以像这样在锁上同步:

synchronize(lock)

否则你也可以在类对象上同步:

synchronize(Verifier.class)
于 2013-11-15T03:16:38.260 回答