За да изясня кода, намекнат в приетия отговор и коментарите, ето моя собствен поглед върху кода, за да получа едновременен слаб набор.
Java, без Guava
Използвайки идиома, предложен в документацията на класа, използвайте Collections.newSetFromMap за обвиване на едновременна карта като набор. Използването на Boolean
като тип стойност на картата е само пълнител, без значение.
Set< YourObjectTypeGoesHere > concurrentWeakSet =
Collections.synchronizedSet(
Collections.newSetFromMap(
new WeakHashMap< YourObjectTypeGoesHere , Boolean >()
)
)
;
Параметризираните типове могат да бъдат изведени, като кодът се опрости до:
Set< YourObjectTypeGoesHere > concurrentWeakSet =
Collections.synchronizedSet(
Collections.newSetFromMap(
new WeakHashMap<>() // Types inferred, so omitted.
)
)
;
Гуава
Като алтернатива можем да използваме MapMaker
от библиотеката на Google Guava.
Вместо да използвате примера на този документ, обвивайки WeakHashMap, заместваме WeakHashMap с карта от Google Guava ="http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/MapMaker.html" rel="nofollow noreferrer">MapMaker според предложението на Guava doc за обадете се на new MapMaker().weakKeys().makeMap()
. Документът на Guava отбелязва, че тази карта "сравнява ключовете, използвайки идентичността на обекта, докато WeakHashMap използва Object.equals
".
Използване
Използването му е по-лесно, отколкото разбирането му!
За създаване на екземпляр
За да създадете паралелен слаб набор, копирайте и поставете следния код. Заменете две срещания на YourObjectTypeGoesHere
.
int level = 16; // Basically, the approximate number of threads that may simultaneously try to mutate the map. See Guava doc.
ConcurrentMap<YourObjectTypeGoesHere , Boolean> concurrentWeakMap = new MapMaker().concurrencyLevel( level ).weakKeys().makeMap(); // Google Guava team recommends MapMaker > weakKeys > makeMap as a replacement for weakHashMap.
Set<YourObjectTypeGoesHere> concurrentWeakSet = Collections.newSetFromMap( concurrentWeakMap ); // Concurrency protection carries over to Set wrapper.
Добавям
За да добавите към комплекта:
concurrentWeakSet.add( myObject );
За повторение
За достъп до елементите в комплекта:
Iterator<YourObjectTypeGoesHere> iterator = concurrentWeakSet.iterator();
while(iterator.hasNext()) {
YourObjectTypeGoesHere myObject = iterator.next();
if( myObject != null ) { // Not sure if needed. Is it possible for object to be garbage-collected but not yet have its entry removed from the Set/Map?
// Work with the object.
}
}
Да премахна
Да си слаб означава, че няма нужда да премахваш елементи. Тъй като елементите стават неизползвани и се събират на боклук, те изчезват от нашата колекция (карта/комплект).
person
Basil Bourque
schedule
14.08.2014