Java同步块不工作

Java同步块不工作,java,multithreading,Java,Multithreading,我有一个多线程java应用程序,它从Postgresql数据库检索用户名进行处理 我只希望每个线程一次处理一个帐户,因此我的表中有一列,该列具有上次访问的时间戳,并且只提取访问时间超过30秒的帐户。下面是SQL查询,我只是想澄清一下 select * from account where (EXTRACT(EPOCH FROM (now() - last_accessed)) > 30 OR last_accessed is null) AND enabled = true order b

我有一个多线程java应用程序,它从Postgresql数据库检索用户名进行处理

我只希望每个线程一次处理一个帐户,因此我的表中有一列,该列具有上次访问的时间戳,并且只提取访问时间超过30秒的帐户。下面是SQL查询,我只是想澄清一下

select * from account where (EXTRACT(EPOCH FROM (now() - last_accessed)) > 30 OR last_accessed is null) AND enabled = true order by random() limit 1
我有一个同步块,因此只有一个线程可以访问帐户检索过程,因为更新时间戳需要数据库上的时间

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类TC扩展了可运行的公共实现
{
RegularExpr reg=新的RegularExpr();
数据库db=新数据库();
公开募捐
{
while(true)
{
尝试
{
ArrayList accountInfo=null;
已同步(此)
{
accountInfo=db.getAccount();
db.updateAccountAccessTime((字符串)accountInfo.get(0));
睡眠(3000);
}
System.out.println((字符串)accountInfo.get(0));
睡眠(9999999);
}
捕获(例外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();
        }
    }
}
公共类主
{
公共静态void main(字符串[]args)
{
对于(int i=0;i<3;i++)
{
System.out.println(“创建线程的内部循环!”);
线程newThread=新线程(新TC());
newThread.start();
}
}
}

但我运行程序时仍然收到相同的帐户。我做错了什么?

每个线程都使用不同的
TC
实例执行

new Thread(new TC())
所以当你这样做的时候:

synchronized (this)
每个线程都在不同的对象上进行同步(不同的
TC
),因此它们根本不会相互竞争。从本质上讲,同步块变得毫无意义

我不确定这是一个多么好的主意,但你正在尝试做的事情会像这样完成:

synchronized (TC.class)
或者,更简洁一点,在类中声明一个静态成员并在其上同步:

private static final Object _lock = new Object();

....

synchronized(_lock)

同步的关键是,当有一个共享资源和多个线程访问它时

在您的情况下,可以将相同的TC实例传递到新线程中,然后3个线程开始处理它

现在需要保护db操作,因为您需要获取帐户信息,还需要更新timestamp.so在锁对象上进行同步,或者这样做


私有对象锁=新对象()

我怎样才能实现我所需要的?你必须在TC类上使用一个静态的final对象,并使用它来同步,而不是使用这个。