Diskuze: Thread: synchronized
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 12 zpráv z 12.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Protože synchronizuješ celou funkci. A v synchronizovaném kódu to i uspíš. Vytořít tedy první instanci, tu spustíš a vstouí do synchronizovaného kódu. Tím umožníš spustit další vlákna, protože čekají až první vlákno zámek uvolní. No a vypadá to, že zámek vlákna získávají v opačném pořadí než přišli, tedy až první vlákno uvolní zámek, potom zámek vezme vlákno poslední, předposlední atd. Řekl bych, že je to otázka implementace v rámci JVM.
A s tou statikou je to jasné. Pokud nebude proměnná statická, potom v každé instanci bude jiný objekt. Každé vlákno tedy bude zamykat objekt ve své konkrétní instanci.
jj ale je to děsivé - jedno slovíčko a jak to úplně změní celou podstatu běhu programu:) toto je fakt jasné, jen jsem na to chtěl poukázat, jak je v tomto případě mocné:)
A jinak jak to tedy řešit? přes join? prostě, jak bys to napsal (třeba i jiným způsobem), aby to vykonalo požadovanou funkci (tj. spustit popořadě všechna vlákna pěkně po sobě)
Typická otázka deva - W T F!!!!
To je typická otázka jen pro deva, který si o tom nic nepřečte.
Pořadí nebo priorita vláken během získávání zámku je
negarantovaná.
To, že se ti to spouští v tomhle pořadí, je náhoda.
To, že se to pokaždé spustilo v tomhle pořadí, je náhoda.
Pokud chceš vlákna vykonávat v pevně definovaném a blokovaném pořadí, nepoužívej vlákna.
Pokud bys ten svůj program chtěl donutit fungovat v zadaném pořadí, mohlo by tě napadnout použít ReentrantLock(fair=true), který používá FIFO politiku a pořadí dodrží.
Jenže ani to nebude stačit, protože neexistuje žádná garance, že
vytvořené vlákno bude ihned spuštěno.
Tím pádem není ani jisté, že vlákna o zámek žádají v pořadí, ve
kterém je vytváříš.
V tom případě je potřeba implementovat primitivum, kterému se říká skupinová bariéra a nevím o tom, že by Java něco takového měla (což nutně neznamená, že nemá).
chlapče, já nejdřív hledám kde můžu na netu a až pak s hodně těžkým srdcem píšu o pomoc. Bohužel, pro threading není nikde žádný tutoriál, který by právě tento problém aspoň nějak nastínil. Spousta chytráků, jako jsi ty, napíše jednoduchý thread, který vypíše 10 čísel a považují to za kompletní sekci-.-
PS: 40x po sobě naprosto stejné pořadí 15 vláken je u tebe náhoda? už radši nepiš jo
Chlapče Číst
tutoriál je narychlo, zalevno a ve slevě, vetšinou je píšou lidé, kteří
se právě dozvěděli, že vlákna existují.
Pokud jsi to explicitně nestudoval na vysoké, tak se čtou knihy zabývající
se multiprocessingem a multithreadingem, čte se dokumentace Javy a JVM, čte se
problematika posixových vláken, která je dobře zdokumentovaná.
4000x po sobě 1000 vláken je pořád náhoda, trvalo mi 2 minuty upravit
tvůj kód do podoby, abych dostal různé pořadí vláken i jejich
spuštění.
Takže ano, žádná garance, jen náhoda a zrovna v tvém programu hned na dvou
místech, až do Javy 1.5 by se ti tvůj program náhodně zasekával a občas
nic nevypsal, občas neskončil, až potom opravili prioritizaci mapování a
vytváření vláken.
prosím o uzavřítí ticketu - já žádal pomoc, ne hlody vola.
Ten vul má ale ve většině pravdu. Threading není věc na kterou najdeš tutorial, je to poměrně rozsáhlá problematika a na její zcela pochopení je potřeba toho znát docela hodně. Ano - jsou na to i navrhove vzory a odborné knížky, které to dobře vysvětlují:) bohužel.. Taktika vyšších jazyk je poskytovat vývojářů nástroje, aby toto znát úplně nemuseli, jako jsou monitory, concurrent kolekce, synchronizační kontexty atp. To vývojář používá a pak je v šoku, že mu to u jednoho případu z milionů funguje jinak. Ideálně na produkci a v bankovním sektoru.
Vím, že je to už pasé, ale chci jen ukázat mnou požadované řešení
(a pochopitelně je to jen example, dalo by se to napsat líp - třeba s
využitím kolekce, cyklů apod.) ale mně šlo hlavně o to, aby to šlo
posloupně.
PS: poradil mi to zkušený programátor, který sám tvrdí, že v
programovacích jazycích existuje spousta slovíček, ale žádné "can't, its
impossible, apod. NEEXISTUJí:)
public class SynchronizedThread implements Runnable {
private Thread thread;
private static Object object = new Object();
private static int number = 1;
private String name;
public static void main(String[] args) {
SynchronizedThread a = new SynchronizedThread("a");
SynchronizedThread b = new SynchronizedThread("b");
SynchronizedThread c = new SynchronizedThread("c");
SynchronizedThread d = new SynchronizedThread("d");
SynchronizedThread e = new SynchronizedThread("e");
SynchronizedThread f = new SynchronizedThread("f");
a.start();
a.join();
b.start();
b.join();
c.start();
c.join();
d.start();
d.join();
e.start();
e.join();
f.start();
f.join();
}
public SynchronizedThread(String name) {
this.name = name;
}
public void start() {
if (thread == null || !thread.isAlive()) {
thread = new Thread(this);
thread.start();
}
}
@Override
public void run() {
synchronized (object) {
for (int i = 0; i < 10; i++) {
System.out.println(i);
try {
Thread.sleep(100);
} catch (InterruptedException exp) {
}
}
System.out.println(number + ". thread DONE! Its thread named " + getName());
number++;
}
}
public String getName() {
return name;
}
private void join() {
try {
thread.join();
} catch (InterruptedException ex) {
}
}
}
úpravy oproti tomu minulému:
Zobrazeno 12 zpráv z 12.