java中同步方法的问题

java中同步方法的问题,java,database,multithreading,synchronized,Java,Database,Multithreading,Synchronized,我在Java中有以下实现,我尝试使用同步方法: class dbAccess{ public synchronized void getGUID(){ counter=/*Access last count from txn_counter table */ /*Insert a unique value to txn_counter table based on the acquired value of counter */

我在Java中有以下实现,我尝试使用同步方法:

class dbAccess{  
     public synchronized void getGUID(){  
           counter=/*Access last count from txn_counter table */
           /*Insert a unique value to txn_counter table based on the acquired value of counter */ 
           /*Insert new counter value to GUID_log table */
     }  
}
/**/之间的部分表示一些sql查询。该实现有10个线程。我希望每次返回的计数器值都是唯一的。但多次运行都会返回相同的计数器值


你能指出我是否做错了什么吗。而且,这是正确的方法吗?

也许您有几个
dbAccess的实例?(synchronized
关键字在对象级别而非类级别工作。)在这种情况下,您需要使方法成为静态的(在您的情况下可能不可行),或者尝试使用静态锁保护方法体,如下所示:

class dbAccess{  
    private final static Object o = new Object();

    public void getGUID(){  
        synchronized (o) {
            counter=/*Access last count from txn_counter table */
            // Insert a unique value to txn_counter table based on
            // the acquired value of counter
            // Insert new counter value to GUID_log table
        }
    }  
}

仅仅因为它在java中是同步的,并不意味着它在数据库中是同步的。此方法需要在启用读取锁定的数据库事务中运行。

在事务中运行的最重要部分是,在下一个线程读取“来自txn_计数的最后一个计数”之前,需要将txn_计数器中更改的值提交到数据库。这是一个合理的建议,但是,如果数据库专用于应用程序,并且只有一个应用程序实例,并且他实际上正在提交db代码中的这些更改,那么在应用程序中进行同步就可以了。尽管基于必须满足的前提条件,它显然是相当脆弱的。@Tim,我的数据库和应用程序符合您描述的情况。db专用于应用程序,并且只有一个应用程序实例正在运行。而且,我一直在尝试从应用程序同步数据库访问部分。我希望它在读取和写入数据库时获得锁。为了使它能够像您期望的那样运行,您需要将事务边界与此同步边界相同。感谢您指出dbAccess的多个实例的问题。这就是我正在做的。现在,我正试图按照您的建议,以静态方法实现它。我希望这对我有用。