проблема с синхронизированным методом в Java - PullRequest
0 голосов
/ 16 декабря 2010

У меня есть следующая реализация в 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 потоков.Я надеялся, что возвращаемое значение счетчика будет уникальным.Но бывает так, что несколько прогонов возвращают одно и то же значение счетчика.

Не могли бы вы указать, что я делаю что-то не так.И это правильный способ сделать это?

Ответы [ 2 ]

5 голосов
/ 16 декабря 2010

То, что оно синхронизировано в Java, не означает, что оно синхронизируется с базой данных.Этот метод должен выполняться в транзакции базы данных с включенной блокировкой чтения.

3 голосов
/ 16 декабря 2010

Возможно, у вас есть несколько экземпляров 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
        }
    }  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...