Concurrency, BlockingQueues (Jawa 7) - 1

"Halo, Amigo!"

"Hai, Kim!"

"Dina iki, aku arep ngomong babagan concurrency."

" Concurrency minangka perpustakaan kelas Java sing kalebu kelas khusus sing wis dioptimalake kanggo karya saka pirang-pirang utas. Iki minangka topik sing menarik lan ekstensif. Nanging dina iki kita mung bakal entuk introduksi. Paket kasebut diarani java.util. paket bebarengan. Aku bakal pitutur marang kowe bab saperangan saka kelas menarik."

" Tipe atom. "

"Sampeyan wis ngerti sing malah count ++ ora operasi thread-aman. Nalika variabel incremented dening 1, telung operasi bener njupuk Panggonan. Akibaté, bisa uga ana konflik nalika variabel diganti."

"Iya, Ellie ngomong aku durung suwe:"

Utas 1 Utas 2 asil
register1 = count;
register1++;
count = register1;
register2 = count;
register2++;
count = register2;
register1 = count;
register2 = count;
register2++;
count = register2;
register1++;
count = register1;

"Persis. Banjur Jawa nambahake jinis data kanggo nindakake operasi kasebut minangka siji, yaiku kanthi atom (atom ora bisa dibagi)."

"Contone, Jawa duwe AtomicInteger, AtomicBoolean, AtomicDouble , etc."

"Upama kita kudu nggawe kelas «counter»:"

Tuladha
class Counter
{
 private int c = 0;

 public void increment()
 {
  c++;
 }

 public void decrement()
 {
  c--;
 }

 public int value()
 {
  return c;
 }
}

"Kepiye sampeyan nggawe obyek saka kelas iki aman-aman?"

"Inggih, aku bakal nggawe kabeh cara disinkronake lan rampung karo:"

Tuladha
class synchronized Counter
{
 private int c = 0;

 public synchronized void increment()
 {
  c++;
 }

 public synchronized void decrement()
 {
  c--;
 }

 public synchronized int value()
 {
  return c;
 }
}

"Karya apik. Nanging, kaya apa yen kita nggunakake jinis atom:"

Tuladha
class AtomicCounter
{
 private AtomicInteger c = new AtomicInteger(0);

 public void increment()
 {
  c.incrementAndGet();
 }

 public void decrement()
 {
  c.decrementAndGet();
 }

 public int value()
 {
  return c.get();
 }
}

"Kelas sampeyan lan kelasku kerjane padha, nanging kelas sing nganggo AtomicInteger luwih cepet."

"Lha, apa bedane cilik?"

"Ya. Adhedhasar pengalaman, aku tansah nyaranake ngarahake kanthi diselarasake. Mung nalika kabeh kode aplikasi wis ditulis lan proses optimasi wis diwiwiti, sampeyan kudu miwiti nulis maneh kode kanggo nggunakake jinis atom. Nanging ing kasus apa wae, aku pengin sampeyan kanggo ngerti manawa jinis kasebut ana. Sanajan sampeyan ora aktif nggunakake, mesthi ana kemungkinan sampeyan bakal nemokake kode sing digunakake.

"Aku setuju. Sing nggawe akal."

"Oalah, sampeyan ngerti yen jinis atom ora bisa diganti ? Beda karo kelas Integer standar , AtomicInteger ngemot cara kanggo ngganti kahanan internal."

"Get it. Kaya String lan StringBuffer ."

"Ya, kaya ngono."

" Koleksi sing aman kanggo benang. "

"Minangka conto koleksi kasebut, aku bisa menehi ConcurrentHashMap. Kepiye carane nggawe HashMap aman kanggo thread?"

"Ngawe kabeh cara sing disinkronake?"

"Manawa, nanging saiki mbayangno yen sampeyan duwe siji SynchronizedHashMap kuwi, lan Welasan Utas ngakses. Lan satus kaping detik entri anyar ditambahake menyang peta, lan ing proses kabeh obyek dikunci kanggo maca lan nulis."

"Inggih, iki pendekatan standar. Apa sampeyan bisa nindakake?"

“Pangripta Jawa nggagas bab-bab kang keren”.

"Kaping pisanan, padha nyimpen data ing ConcurrentHashMap ing blok siji, nanging dibagi dadi bagean sing diarani 'ember'. Lan nalika ana wong ngganti data ing ConcurrentHashMap, mula kita mung ngunci ember sing diakses, tinimbang kabeh obyek. Ing liyane tembung, akeh utas bisa ngganti obyek bebarengan."

"Kapindho, apa sampeyan ngelingi yen sampeyan ora bisa ngulang unsur-unsur dhaptar / peta lan ngganti dhaptar ing wektu sing padha? Kode kasebut bakal mbuwang pengecualian: "

Aja ngulang unsur koleksi ing daur ulang lan ngganti bebarengan
HashMap<String, Integer> map = new HashMap<String, Integer>();

for (String key: map.keySet())
{
 if (map.get(key) == 0)
  map.remove(key);
}

"Nanging ing ConcurrentHashMap, sampeyan bisa:"

Aja ngulang unsur-unsur koleksi ing daur ulang lan ngganti bebarengan"
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<String, Integer>();

for (String key: map.keySet())
{
 if (map.get(key) == 0)
  map.remove(key);
}

"Paket bebarengan duwe akeh kaluwihan. Kita mung kudu ngerti kelas kasebut kanthi becik supaya bisa digunakake."

"Aku ngerti. Thanks, Kim. Iki kelas tenan menarik. Muga-muga ing sawijining dina aku bakal nguwasani kaya virtuoso."