/ / Selektywne wymuszanie synchronizacji w celu ułatwienia maksymalnej współbieżności - java, wielowątkowość, współbieżność, synchronizacja, czekanie

Selektywne wymuszanie synchronizacji w celu ułatwienia maksymalnej współbieżności - Java, wielowątkowość, współbieżność, synchronizacja, oczekiwanie

Oto, co próbuję zrobić z Javą:

while(writeSetsIntersect()) {
wait();
}
doStuff
notifyAll();

Oto gdzie utknąłem: doStuff mogą być wykonywane równocześnie, jeśli dwa wątki zapisują różne zmienne, tj. mają rozłączne zestawy zapisu. Jeśli zestawy zapisu się przecinają, wątki muszą się zmieniać. Więc nie mogę tak po prostu położyć doStuff w zsynchronizowanym bloku, ponieważ nie zawsze jest (i może nigdy nie być) potrzebny.

Mogłem zablokować elementy w zestawie do zapisu, ale jeśli dwa wątki z przecinającymi się zestawami zapisu czekają na tę samą blokadę, może wystąpić zakleszczenie. Jak na przykład:

Lock[] locks = new Lock[allAvailableVariables.length];
public void getLocks() {
for(i = 0; i < allAvailableVariables.length; i++)
if(i is in writeSet)
locks[i].lock();
}

Najprostszy sposób, aby tego uniknąć (o ile mogęwymyślić) jest zsynchronizowanie akwizycji zamków w zestawie do zapisu. Jeśli jednak dwa wątki z przecinającym się zestawem zapisu próbują dostać się do bloku synchronizacji, wątek z zestawem rozłącznym od pozostałych dwóch musiałby poczekać, aż opuszczą blok synchronizacji.

Sądzę, że mógłbym mieć blokadę wirowania, ale chciałbym tego uniknąć, jeśli to możliwe, ponieważ ocena, czy zestawy zapisu się przecinają, może być kosztowna.

Czy to w ogóle ma sens?

Odpowiedzi:

3 dla odpowiedzi № 1

Wygląda na to, że chcesz użyć zamawiania zamków.

Posortuj zamki w jakiś naturalny porządek. Następnie zablokuj po kolei.

Załóżmy, że masz blokady a i b z a < b. Jeśli dwa wątki chcą zablokować oba a i b, oboje się zablokują a pierwszy. Więc nie możesz mieć sytuacji, w której wątek został zablokowany b i jest zablokowany a, podczas gdy inny wątek został zablokowany a jest zablokowany b.