Article View: pl.comp.lang.java
Article #154016Wielowatkowość i Singleton
From: tomjas
Date: Fri, 30 May 2014 17:21
Date: Fri, 30 May 2014 17:21
84 lines
3363 bytes
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-mailShow 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