🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.java
Article #154016

Wielowatkowość i Singleton

#154016
From: tomjas
Date: Fri, 30 May 2014 17:21
84 lines
3363 bytes
Witam.

Tak w ramach ćwiczeń postanowiłem sobie poćwiczyć różne wersje wzorca
singleton. Poniżej kod testujący singleton w najprostszej wersji
Lazy-Initialization (oczywiście abstrahujemy od jakości wersji wzorca
- wiem, że nie jest to najlepsze rozwiązanie). A więc sam signleton:

#v+
class Counter {
    private static Counter INSTANCE;

    private Counter(){}
    
    public static synchronized Counter getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new Counter();
        }
        return INSTANCE;
    }
}
#v-

teraz klasa, która zawiera kod w tworzonych wątkach. Do konstruktora
przekazuję hashmapę, w której będę zliczał obiekty o takim samym
hashkodzie:


#v+
class CounterThread implements Runnable {

    Map<Integer, Integer> map;

    public CounterThread(Map<Integer, Integer> map) {
        this.map = map;
    }

    @Override
    public void run() {
        Counter cnt = Counter.getInstance();
        int hash = cnt.hashCode();
        Integer freq = map.get(hash);
        map.put(hash, (freq == null) ? 1 : freq + 1);
    }
}
#v-

No i klasa tworząca 1000 wątków.

#v+
public class Main {
    public static void main(String[] args) {

        Map<Integer, Integer> map = Collections
                .synchronizedMap(new HashMap<Integer, Integer>());

        for (int i = 0; i < 1_000; i++) {
            new Thread(new CounterThread(map)).start();
        }

        try {
            Thread.sleep(5000);
            System.out.println(map);
        } catch (InterruptedException e) {
        }
    }
}
#v-


Dla pewności daję głównegmu wątkowi odpocząć 5 sek i sprawdzam hashmapę.
A wynik wygląda np. tak:

{1704732977=897}


Rzecz jasna za każdym wywołaniem zmienia się wartość hashkodu i ich
liczba, ale - i tu moje pytanie - co z resztą wątków tworzących obiekty
singletona (Counter) i licząca dla nich haskody? Przecież powinno być
ich 1000. Gdzie popełniam błąd, bo już mi monitor oczy wypala
od wpatrywania?

Dodatkowo, dlaczego jeśli utworzę zwykłą hashmapę bez synchronizacji, to
jej odczyt wygląda jak powyżej, a odczyt jej wielkości (map.size())
potrafi pokazać 2-5 elementów?
Technical Details
Message-ID: <slrnlohfgo.ngq.tomjas@darkstar.example.net>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin2!goblin.stu.neva.ru!feeder.erje.net!us.feeder.erje.net!news.ripco.com!news.glorb.com!peer03.iad.highwinds-media.com!news.highwinds-media.com!feed-me.highwinds-media.com!nx02.iad01.newshosting.com!newshosting.com!newsfeed.neostrada.pl!unt-exc-02.news.neostrada.pl!unt-spo-a-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin2!goblin.stu.neva.ru!feeder.erje.net!us.feeder.erje.net!news.ripco.com!news.glorb.com!peer03.iad.highwinds-media.com!news.highwinds-media.com!feed-me.highwinds-media.com!nx02.iad01.newshosting.com!newshosting.com!newsfeed.neostrada.pl!unt-exc-02.news.neostrada.pl!unt-spo-a-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
Newsgroups: pl.comp.lang.java
From: tomjas <tomjas@WYTNIJTOpoczta.onet.pl>
Subject: Wielowatkowość i Singleton
Reply-To: tomjas
User-Agent: slrn/1.0.1 (Linux)
Mime-Version: 1.0
Message-ID: <slrnlohfgo.ngq.tomjas@darkstar.example.net>
Date: 30 May 2014 17:21:29 GMT
Lines: 84
Organization: Telekomunikacja Polska
NNTP-Posting-Host: ip-78-30-114-36.free.aero2.net.pl
X-Trace: 1401470489 unt-rea-a-02.news.neostrada.pl 2147 78.30.114.36:37625
X-Complaints-To: abuse@news.neostrada.pl
X-Received-Bytes: 3045
X-Received-Body-CRC: 4181786775
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit