2013-11-15 17 views
1

相关的问题: Java Threading with MYSQL puzzled荒诞的Java多线程和MySQL的syncrhonization

计数器INT,是同步的,在函数调用的executeQuery不同步。 结果我得到

计数器:从MYSQL 1个

行:1

计数器:从MySQL 2

行:1

计数器:3

行从MYSQL:1

Expect编辑输出 - >来自MYSQL的行:应该与计数器相同

所有线程同时运行第一个查询。因此他们得到相同的结果编号。但是它们会同步迭代计数器。对我来说这是荒谬的。此行为是否记录在案?我怎样才能绕过它? 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

您的代码原样意味着您的更新查询,增量和sysout将在3个不同的对象锁上同步,而不是1。 – shazin

回答

1

编辑: 我看到的问题,您更新查询未提交的结果。你在更新之后提交,你会看到表格数量也会改变。

EDIT2:OP说

预期输出 - >从MySQL行:应该是同柜台

但目前这个代码是无法实现的。以下是程序的逻辑:

  1. 获取所有的行与checked='0'
  2. 线程将更新获取的所有行checked='1'
  3. 第二个线程来了,它试图找到checked='0'行,这将永远是0,如果第一个线程犯行。

为了实现这个行为,你应该在你的查询,而不是没有硬编码checked='0'应该从线程数[中i值传递到验证]

EDIT3得出: 有一个修正这里,线程将不会按顺序执行,因为为每个线程创建新的database。以上几点仍然适用,但这会让预期结果更加困难。

+0

计数器只是显示同步正在工作。我的主要问题是所有的线程都会获取同一行而不是连续的行。 – NinjaStars

+0

请澄清你的意思,“你在更新之后提交,你会发现表格数量也会改变。” – NinjaStars

+0

仅当执行查询时,如果将自动提交设置为false,则不会提交结果。所以要么将auto commit设置为true,要明确提交。 – Lokesh