eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingOpowiadanie o GCRe: Opowiadanie o GC
  • Data: 2009-07-27 10:09:38
    Temat: Re: Opowiadanie o GC
    Od: Michal Kleczek <k...@g...com> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    Michal Kleczek wrote:

    [ciach]
    >
    > Nie trzeba watku skanujacego - wystarczy usuwajacy. Od skanowania jest
    > java.lang.ref.ReferenceQueue
    >

    Sprobuj moze jakos tak:

    class IdMap<ID, ITEM> {

    private final Map<Reference<?>, ID> refToIdMap = new HashMap();
    private final Map<ID, Reference<ITEM>> idToRefMap = new HashMap();

    private final ReferenceQueue<ITEM> referenceQueue = new ReferenceQueue();

    //needs to be static so that we do not keep
    //reference to the parent IdMap
    private static class Remover<S, T> implements Runnable {

    //keep just a (weak) reference to parent map
    //so that we know when to finish removal
    private final Reference<IdMap<S, T>> idMapRef;

    private ReferenceQueue<T> getRefQueue() {
    IdMap<S, T> idMap = idMapRef.get();
    return idMap != null ? idMap.referenceQueue : null;
    }

    public Remover(IdMap<S, T> idMap) {
    this.idMapRef = new WeakReference<IdMap<S, T>>(idMap);
    }

    @Override
    public void run() {
    try {
    ReferenceQueue<T> referenceQueue = getRefQueue();
    while (referenceQueue != null) {
    //wait for next reference to remove
    final Reference<? extends T> itemRef = referenceQueue.remove();
    final IdMap<S, T> idMap = idMapRef.get();
    if (idMap != null) {
    idMap.remove(itemRef);
    }

    referenceQueue = getRefQueue();
    }
    }
    catch (InterruptedException e) {
    //ignore and return
    }
    }

    }

    private synchronized void remove(Reference<?> ref) {
    final ID id = refToIdMap.remove(ref);
    idToRefMap.remove(id);
    }

    public IdMap() {
    new Thread(new Remover(this)).start();
    }

    public ITEM get(ID id) {
    final Reference<ITEM> itemRef = idToRefMap.get(id);
    return itemRef != null ? itemRef.get() : null;
    }

    public synchronized void put(ID id, ITEM item) {
    final Reference<ITEM> itemRef = new WeakReference<ITEM>(item);
    idToRefMap.put(id, itemRef);
    refToIdMap.put(itemRef, id);
    }

    }


    --
    Michal

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: