спящий и блокирующий - PullRequest
       1

спящий и блокирующий

0 голосов
/ 19 сентября 2011

Я пытаюсь исключить две темы чтения из чтения одной и той же записи через спящий режим.Мой SSCCE такой же, как и выше, но оба потока могут прочитать объект, хотя я ожидал, что Thread-2 сгенерирует исключение.

Класс Store - мой класс для простого создания сеансов.

Сейчас я тестирую с HSQLDB, может быть, нет доступной блокировки?

Обновление Сделал то, что предлагает Аугусто, но все так же.Поток-2 должен выдать исключение (?)

        new Thread(new Runnable() { // Thread-1

            @Override
            public void run() {
                Session ses = Store.$.ses();
                Object x = ses.load(Client.class, 1l,
                        new LockOptions(LockMode.PESSIMISTIC_WRITE));
                System.err.println("T1 :"+(x==null));
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException ex) {
                }
                ses.close();
            }
        }).start();

        Thread.yield();

        new Thread(new Runnable() { // Thread-2

            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException ex) {
                }
                Session ses = Store.$.ses();
                Object x = ses.load(Client.class, 1L,
                        new LockOptions(LockMode.PESSIMISTIC_WRITE).setTimeOut(1));
                System.err.println("T2 :"+(x==null));
                ses.close();
            }
        }).start();

Output:

T1: false
t2: false

1 Ответ

1 голос
/ 19 сентября 2011

LockMode.Read - это общая блокировка, поэтому все операции чтения в этом режиме блокировки смогут читать из одного и того же источника без блокировки.

Я думаю, что вам нужна эксклюзивная блокировка, которая используетLockMode.PESSIMISTIC_WRITE.И HSQLDB поддерживает этот тип блокировки ( docs )

Я бы также добавил Thread.yield() между двумя потоками, чтобы позволить первому запускаться фактически, иначе 2-й поток мог бы начаться раньше1-й, который вы определили.


Я не думаю, что HSQLDB имеет тайм-аут блокировки, и, таким образом, выдает исключение, когда поток ожидает блокировки в течение более заданного периода времени.Вы увидите, что ses.load в T2 всегда будет происходить после ses.close от t1.

Если у вас есть база данных mysql, вы можете обновить конфигурацию с помощью innodb_lock_wait_timeout = 2, которая будетЗаставить БД выдать тайм-аут блокировки через 2 секунды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...