Vor kurzem habe ich "Java -Parallelität in der Praxis" gelesen. < /p>
jedoch; Ich kann es nicht leise verstehen.
Hier ist die Situation!@Immutable
class OneValueCache {
private final BigInteger lastNumber;
private final BigInteger[] lastFactors;
public OneValueCache(BigInteger i, BigInteger[] factors) {
lastNumber = i;
lastFactors = Arrays.copyOf(factors, factors.length);
}
public BigInteger[] getFactors(BigInteger i) {
if (lastNumber == null || !lastNumber.equals(i))
return null;
else
return Arrays.copyOf(lastFactors, lastFactors.length);
}
}
< /code>
Angenommen, wir haben ein Servlet wie dieses < /p>
public class MyServlet {
private volatile OneValueCache immutableValue;
.
.
public void service(){
.
// what this function do : gets value from immutable object increments its
// value and creates new Immutable object and put it back.
//
.
immutableValue = new OneValueCache( lastNumber, lastFactor[]);
.
.
.
}
.
.
.
}
< /code>
Nach dem Buch MyServlet ist ein Thread sicher, weil es ein unveränderliches Objekt mit volatilem Schlüsselwort veröffentlicht! var; < /p>
Thread 2 In der Zeit 0 Lesen Sie die Werte von unveränderlichem Wert bis zu seinem Stapel Var; < /p>
Thread 1 In der Zeit 1 Inkrementieren Sie die Werte in Stapelvariablen und erstellen Sie ein neues OneValuecache < /> Objekt - BR />
Objekt - was unveränderlich ist - und geben Sie es in die Feldvariable mit unverfälschung Value. /> "
Diese Kombination eines unveränderlichen Inhaltsobjekts für
Multiple-Status-Variablen, die durch eine Invariante zusammenhängen, und eine flüchtige Referenz, die zur rechtzeitigen Sichtbarkeit verwendet wird, ermöglicht es volatilecachedfactorizer, dass es kein explizites Locking ist. Fehlt mir hier? Wir können keinen ungültigen OneValuecache -Status haben. Aber hier gibt es die Chance für verlorenes Update, wie meine Threadsequenz zeigt. Die Klasse ist also nicht fadensicher!
Ist es sicher, volatile, um unveränderliche Objekte zu veröffentlichen? ⇐ Java
-
- Similar Topics
- Replies
- Views
- Last post