2013-11-15 14 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