Java Mutex и Hibernate Ontity StateJAVA

Программисты JAVA общаются здесь
Anonymous
Java Mutex и Hibernate Ontity State

Сообщение Anonymous »

реализация тестирования < /h3>
Я запускаю этот кусок кода в четырех потоках параллельно: < /p>

Код: Выделить всё

private volatile static boolean mutex = false;

private class Worker implements Runnable {

@Override
public void run() {
Session session = sessionFactory.openSession();
for (int i = 0; i < UPDATE_COUNT; i++) {
plusOne(session, Thread.currentThread().getId());
}
session.close();
}

private synchronized void plusOne(Session session, long threadId) {
while (mutex) {
Thread.yield();
}
mutex = true;
System.out.printf("thread-%d: mutex lock, begin, update\n", threadId);
session.beginTransaction();
MyEntity myEntity =
(MyEntity) session.createQuery("from MyEntity").list().get(0);
int oldValue = myEntity.getMyColumn();
int newValue = oldValue + 1;
myEntity.setMyColumn(newValue);
System.out.printf("thread-%d: %d + 1 = %d\n",
threadId, oldValue, newValue);
System.out.printf("thread-%d: commit, mutex release\n", threadId);
session.getTransaction().commit();
mutex = false;
}

}
< /code>
 output < /h3>
Вот пример вывода: < /p>
...
thread-17: mutex lock, begin, update
thread-17: 1 + 1 = 2
thread-17: commit, mutex release
thread-17: mutex lock, begin, update
thread-18: mutex lock, begin, update
thread-19: mutex lock, begin, update
thread-17: 2 + 1 = 3
thread-17: commit, mutex release
thread-18: 2 + 1 = 3
thread-18: commit, mutex release
...
< /code>
Вывод варьируется из -за планирования потоков.thread-17: mutex lock, begin, update
thread-18: mutex lock, begin, update
...
thread-17: commit, mutex release
Как может Thread-18 достичь этой строки между двумя потоками-17 строк в «Br/> Synchronized Method, который использует логическую переменную mutex для принятия решения
helled или нет? Значение атрибута объекта после совершения < /h3>

Код: Выделить всё

thread-17: 2 + 1 = 3
thread-17: commit, mutex release
thread-18: 2 + 1 = 3
thread-18: commit, mutex release
Как может быть OldValue BE 2 в потоке-18 , хотя Thread-17 имеет Completed
значение 3 ? Может быть, это потому, что Java Mutex не удается (вопрос № 1), и оба
потоки могут войти в параллельную линию int oldvalue = myentity.getmycolumn () < /code>
, где читается старое значение? 11.0.12+7-post-debian-2
[*] hibernate 5.6.0
[*] junit 4.13.2

Попробуйте себя
.>

Подробнее здесь: https://stackoverflow.com/questions/695 ... tity-state

Вернуться в «JAVA»