2015-07-04 154 views
2

我有一個多線程java應用程序,它從Postgresql數據庫檢索用戶名以進行處理。Java同步塊不能正常工作

我只希望每個線程一次處理一個帳戶,因此我的表中有一列有上次訪問的時間戳,只有超過30秒的訪問權限的帳戶纔會被提取。 SQL查詢的作品如下,我只是發佈它是明確的。

​​

我有一個synchronized塊,從而將更新時間戳花費的時間是數據庫的出價只有一個線程可以訪問該帳戶檢索過程。

public class TC extends Common implements Runnable 
{ 
    RegularExpr reg = new RegularExpr(); 
    Database  db = new Database(); 

    public void run() 
    { 
     while (true) 
     { 
      try 
      { 
       ArrayList<Object> accountInfo = null; 

       synchronized (this) 
       { 
        accountInfo = db.getAccount(); 
        db.updateAccountAccessTime((String) accountInfo.get(0)); 
        Thread.sleep(3000); 
       } 
       System.out.println((String) accountInfo.get(0)); 
       Thread.sleep(9999999); 
      } 
      catch(Exception e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

我的主類

public class Main 
{ 
    public static void main(String[] args) 
    { 

     for (int i = 0; i < 3; i++) 
     { 
      System.out.println("Inside loop to create threads!"); 
      Thread newThread = new Thread(new TC()); 
      newThread.start(); 
     } 
    } 
} 

但我仍然收到相同的帳戶,當我運行程序。我做錯了什麼?

回答

3

每個線程正在執行一個不同的實例TC

new Thread(new TC()) 

所以,當你這樣做:

synchronized (this) 

每個線程都是一個不同的對象(不同TC)上同步,所以它們不會互相在所有競爭。本質上,同步塊變得毫無意義。

我不知道有多好主意,這是的,但你正在嘗試做的就完成這樣的:通過聲明的靜態成員

synchronized (TC.class) 

,或者也許有點清潔,該類和同步:

private static final Object _lock = new Object(); 

.... 

synchronized(_lock) 
+0

我該如何實現我所需要的? – Arya

+0

您將不得不在TC類上使用靜態最終對象,並使用它來同步而不是使用它。 – Codebender

0

整個同步點是,當有共享資源和多個線程訪問它。

在你的情況,相同的TC實例可以被傳遞到新的Thread.then 3個線程開始工作。

現在數據庫操作需要保護,因爲您需要獲取帳戶信息並更新timestamp.so同步鎖對象專門或此。

private Object lock = new Object();