1: SELECT * FROM account WHERE id = 42;
1: ...
1: UPDATE account SET money = 1234 WHERE id = 42;
1: SELECT * FROM account WHERE id = 42;
2: SELECT * FROM account WHERE id = 42;
1: ...
2: ...
1: UPDATE account SET money = 1234 WHERE id = 42;
2: UPDATE account SET money = 2345 WHERE id = 42;
class Foo {
private Helper helper = null;
public Helper getHelper() {
if (helper == null)
helper = new Helper();
return helper;
}
}
Модель памяти Java стала первой попыткой разработать исчерпывающую модель межпоточного взаимодействия для крупного языка программирования.
Требования к транзакционной системе, обеспечивающие наиболее надёжную и предсказуемую её работу.
SELECT * FROM account WHERE id = 42 FOR UPDATE;
...
UPDATE account SET money = 1234 WHERE id = 42;
class Foo {
private Helper helper = null;
public synchronized Helper getHelper() {
if (helper == null)
helper = new Helper();
return helper;
}
}
Когды вы оперируете lock’ами могут случиться четыре типа проблем:
LOCK A | LOCK B |
... | ... |
LOCK B | LOCK A |
... | ... |
UNLOCK B | UNLOCK A |
UNLOCK B | UNLOCK A |
SELECT * FROM account WHERE id = 42;
...
UPDATE account SET
version = 8,
money = 1234
WHERE id = 42
AND version = 7;
SELECT xmin, * FROM account WHERE id = 42;
...
UPDATE account SET
money = 1234
WHERE id = 42
AND xmin = 1528942;
void stack_push(stack* s, node* n) {
node* head;
do {
head = s->head;
n->next = head;
} while (!atomic_compare_exchange(s->head, head, n));
}
node *stack_pop(stack* s) {
node* head, next;
do {
head = s->head;
next = head->next;
} while (!atomic_compare_exchange(s->head, head, next));
return head;
}