Głównym problemem, z którym spotykamy się z wielowątkowym kodem, jest udostępnianie danych, a ja zgadzam się z celem procesu paraliżowania konkurencyjności i "dzieje się to" w sposób "spokojny", że podczas paraliżowanego przetwarzania wątki wymagają dostępu do odczytu/zapisu na udostępnione dane.
Java zsynchronizowane słowa kluczowego dopuszcza następujące:
Mówi JVM umieścić blokadę na monitorze obiektu lub kawałek zsynchronizowanego kodu, co daje mu wyłącznego dostępu do tej części kodu lub obiektu .
Oto przykład Singleton:
public class Singleton {
private Singleton INSTANCE;
private Singleton() {
}
public Singleton getInstance() {
if (null == INSTANCE) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
Ten Singleton nie jest wątek bezpieczny, jeśli wątek próbuje dostać instancji, podczas gdy inny jest również stara się zrobić to samo (warunek race) to może się zdarzyć, że przedtem wątek numer jeden zakończy tworzenie instancji, drugi już miał dostęp do metody getInstance()
i stworzył własną instancję Singleton, co oznacza, że w czasie T powinniśmy mieć dwa wystąpienia Singleton (zwane multiton w tym czasie).
Aby rozwiązać ten problem, musimy synchronizować kreacyjnych zachowanie Singleton, może to być wykonane przez kluczowych synchronized
powyżej if na sobie INSTANCE
:
public class Singleton {
private Singleton INSTANCE;
private Singleton() {
}
public Singleton getInstance() {
synchronized (Singleton.class) {
if (null == INSTANCE) {
synchronized(Singleton.class) {
Singleton inst = new Singleton();
INSTANCE = inst;
}
}
}
return INSTANCE;
}
}
W rezultacie, gdy pierwszy wątek prosi instancję Singleton i podczas tworzenia JVM zablokuje monitor INSTANCE odmawiając dostępu do INSTANCJI, aż wątek jeden zakończy jego żądanie.
Istnieją różne sposoby, aby to osiągnąć, cytowana wcześniej książka jest doskonałym źródłem nauki, javadoc również.
Dziękujemy! Ale co dokładnie jest zsynchronizowanym słowem kluczowym, jest to muteks? I na platformie różnej, skoro wątki mogą być różne, czy będzie też inaczej? – Zonata
To muteks. Muteks wprowadzający ponownie. –