2015-07-04 146 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();