Diskuze: Thread: synchronized
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 12 zpráv z 12.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
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.
