Powiel możliwe:
What is the best way to increase number of locks in javaSynchronizacja na wartość całkowitą
Przypuśćmy, że chcesz zablokować w oparciu o całkowitą wartość id. W takim przypadku istnieje funkcja, która pobiera wartość z pamięci podręcznej i pobiera dość drogie pliki do pamięci podręcznej, jeśli ich nie ma.
Istniejący kod nie jest zsynchronizowane i mogą powodować wiele pobierać operacji/przechowywanie:
//psuedocode
public Page getPage (Integer id){
Page p = cache.get(id);
if (p==null)
{
p=getFromDataBase(id);
cache.store(p);
}
}
Jakie chciałem zrobić to zsynchronizować pobierać na identyfikatorze, na przykład
if (p==null)
{
synchronized (id)
{
..retrieve, store
}
}
Niestety to nie będzie działać, ponieważ 2 oddzielne połączenia mogą mieć taką samą wartość Integer id ale inny obiekt Integer, więc nie będą dzielić się zamek i brak synchronizacji nastąpi.
Czy istnieje prosty sposób na zapewnienie, że masz tę samą instancję typu Integer? Na przykład, to będzie działać:
syncrhonized (Integer.valueOf(id.intValue())){
Javadoc dla Integer.valueOf() zdaje się sugerować, że jesteś prawdopodobne, aby uzyskać ten sam przypadek, ale to nie wygląda gwarancji:
Powoduje zwrócenie instancji Integer reprezentującej określoną wartość typu int. razie wymagany jest nowy przypadek całkowita metoda ta powinna generalnie pierwszeństwo do konstruktora całkowitych (INT), a metoda ta może otrzymując znacznie lepsze w czasie i przestrzeni występ buforowanie często wystąpił o wartości.
Tak, wszelkie sugestie, w jaki sposób uzyskać wystąpienie Integer, które gwarantuje, że są takie same, inne niż bardziej skomplikowane rozwiązania, takie jak utrzymywanie WeakHashMap obiektów Lock z kluczem do int? (nic w tym złego, po prostu wydaje się, że musi istnieć oczywisty jeden-liniowy, niż mi brakuje).
To pytanie "duplikat" i odpowiedź Eddiego są lepsze niż "oryginalne" pytanie! – arun
Zobacz także http://stackoverflow.com/questions/6616141/java-threads-locking-on-a-specific-object w szczególności http://stackoverflow.com/a/27806218/32453 – rogerdpack
Co z użyciem [AtomicInteger] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html)? – GregT