CodeGym /Blog Jawa /Acak /Sinkronisasi thread. Operator sing disinkronake
John Squirrels
tingkat
San Francisco

Sinkronisasi thread. Operator sing disinkronake

Diterbitake ing grup
Hi! Dina iki kita bakal terus nimbang fitur saka program multithreaded lan ngomong bab sinkronisasi thread. Sinkronisasi thread.  Operator sing disinkronake - 1

Apa sing diarani sinkronisasi ing basa Jawa?

Ing njaba domain pemrograman, iki nuduhake pengaturan sing ngidini rong piranti utawa program bisa digunakake bebarengan. Contone, smartphone lan komputer bisa disinkronake karo akun Google, lan akun situs web bisa diselarasake karo akun jaringan sosial supaya sampeyan bisa nggunakake akun kasebut kanggo mlebu. saben liyane. Ing pawulangan sadurunge, utas kita urip lan makarya kanthi kapisah. Siji nindakake pitungan, liyane turu, lan katelu ditampilake soko ing console, nanging padha ora sesambungan. Ing program nyata, kahanan kaya mengkono langka. Multiple thread bisa aktif nggarap lan ngowahi set data sing padha. Iki nggawe masalah. Bayangake sawetara utas nulis teks menyang panggonan sing padha, contone, menyang file teks utawa konsol. Ing kasus iki, file utawa konsol dadi sumber daya sing dienggo bareng. Utas kasebut ora ngerti anane saben liyane, mula dheweke mung nulis kabeh sing bisa ditindakake ing wektu sing diwenehake dening panjadwal thread. Ing pawulangan anyar, kita weruh conto saka ngendi iki ndadékaké. Ayo kelingan saiki: Sinkronisasi thread.  Operator sing disinkronake - 2Alesane dumunung ing kasunyatan manawa benang kasebut nggarap sumber daya sing dienggo bareng (konsol) tanpa koordinasi tumindake. Yen panjadwal thread nyedhiyakake wektu kanggo Thread-1, banjur langsung nulis kabeh menyang console. Utas liyane sing wis utawa durung bisa ditulis ora dadi masalah. Asil, minangka sampeyan bisa ndeleng, depressing. Mulane dheweke ngenalake konsep khusus, mutex (mutual exclusion) , kanggo pemrograman multithreaded. Tujuan saka mutexyaiku nyedhiyakake mekanisme supaya mung siji thread sing nduweni akses menyang obyek ing wektu tartamtu. Yen Utas-1 entuk mutex obyek A, benang liyane ora bakal bisa ngakses lan ngowahi obyek kasebut. Utas liyane kudu ngenteni nganti obyek A mutex dirilis. Iki minangka conto saka urip: bayangake sampeyan lan 10 wong liya sing melu olahraga. Ngganti, sampeyan kudu nyatakake gagasan lan ngrembug babagan. Nanging amarga sampeyan ndeleng siji liyane kanggo pisanan, supaya ora terus-terusan interupsi lan mabur menyang nesu, sampeyan nggunakake 'bal omong': mung wong sing duwe bal bisa ngomong. Kanthi cara iki sampeyan bakal duwe diskusi sing apik lan apik. Ateges, bal iku mutex. Yen mutex obyek ana ing tangan siji benang, benang liyane ora bisa digunakake karo obyek kasebut.Objectkelas, tegese saben obyek ing Jawa nduweni siji.

Cara kerja operator sing disinkronake

Ayo ngerteni tembung kunci anyar: disinkronake . Iki digunakake kanggo menehi tandha blok kode tartamtu. Yen blok kode ditandhani nganggo synchronizedtembung kunci, mula blok kasebut mung bisa dieksekusi kanthi siji utas. Sinkronisasi bisa ditindakake kanthi cara sing beda-beda. Contone, kanthi nyatakake kabeh cara supaya disinkronake:

public synchronized void doSomething() {

   // ...Method logic
}
Utawa tulis blok kode ing ngendi sinkronisasi ditindakake nggunakake sawetara obyek:

public class Main {

   private Object obj = new Object();

   public void doSomething() {

       // ...Some logic available simultaneously to all threads

       synchronized (obj) {

           // Logic available to just one thread at a time
       }
   }
}
Tegesipun prasaja. Yen siji utas mlebu ing blok kode sing ditandhani nganggo synchronizedtembung kunci, bakal langsung nangkep mutex obyek kasebut, lan kabeh utas liyane sing nyoba mlebu blok utawa metode sing padha dipeksa ngenteni nganti benang sadurunge ngrampungake karyane lan ngeculake monitor. Sinkronisasi thread.  Operator sing disinkronake - 3Miturut cara! Sajrone kursus, sampeyan wis ndeleng conto synchronized, nanging katon beda:

public void swap()
{
   synchronized (this)
   {
       // ...Method logic
   }
}
Topik anyar kanggo sampeyan. Lan, mesthi, bakal ana kebingungan karo sintaksis. Dadi, enggal-enggal ngapalake supaya ora bingung mengko kanthi cara nulis sing beda-beda. Loro cara nulis iki tegese padha:

public void swap() {

   synchronized (this)
   {
       // ...Method logic
   }
}


public synchronized void swap() {

   }
}
Ing kasus sing sepisanan, sampeyan nggawe blok kode sing disinkronake langsung nalika ngetik metode kasebut. Iki disinkronake karo thisobyek, yaiku obyek saiki. Lan ing conto kapindho, sampeyan nggunakake synchronizedtembung kunci kanggo kabeh cara. Iki ndadekake ora perlu kanggo nuduhake kanthi jelas obyek sing digunakake kanggo sinkronisasi. Wiwit kabeh cara ditandhani nganggo tembung kunci, metode kasebut bakal disinkronake kanthi otomatis kanggo kabeh kedadeyan kelas. Kita ora bakal ngrembug babagan cara sing luwih apik. Saiki, pilih cara sing paling disenengi :) Ingkang utama yaiku elinga: sampeyan bisa ngumumake metode sing disinkronake mung nalika kabeh logika dieksekusi dening siji utas sekaligus. Contone, bakal dadi salah yen nggawe doSomething()cara ing ngisor iki disinkronake:

public class Main {

   private Object obj = new Object();

   public void doSomething() {

       // ...Some logic available simultaneously to all threads

       synchronized (obj) {

           // Logic available to just one thread at a time
       }
   }
}
Kaya sing sampeyan ngerteni, bagean saka metode kasebut ngemot logika sing ora mbutuhake sinkronisasi. Kode kasebut bisa ditindakake kanthi pirang-pirang utas ing wektu sing padha, lan kabeh papan kritis dipisahake ing synchronizedblok sing kapisah. Lan siji bab liyane. Ayo ditliti kanthi rapet conto saka pawulangan kanthi ngganti jeneng:

public void swap()
{
   synchronized (this)
   {
       // ...Method logic
   }
}
Cathetan: sinkronisasi ditindakake nggunakakethis. Yaiku, nggunakakeMyClassobyek tartamtu. Upaminipun kita duwe 2 Utas (Thread-1lanThread-2) lan mung sijiMyClass myClassobyek. Ing kasus iki, yenThread-1nelponmyClass.swap()cara, mutex obyek bakal sibuk, lan nalika nyoba kanggo nelponmyClass.swap()caraThread-2bakal macet nalika nunggu mutex dirilis. Yen kita duwe 2 utas lan 2MyClassobyek (myClass1lanmyClass2), kita bisa kanthi gampang nglakokake metode sing disinkronake ing macem-macem obyek. Utas pisanan nindakake iki:

myClass1.swap();
Kapindho nindakake iki:

myClass2.swap();
Ing kasus iki, synchronizedtembung kunci ing swap()cara kasebut ora bakal mengaruhi operasi program, amarga sinkronisasi ditindakake nggunakake obyek tartamtu. Lan ing kasus terakhir, kita duwe 2 obyek. Dadi, benang ora nggawe masalah kanggo saben liyane. Sawise kabeh, rong obyek duwe 2 mutex sing beda-beda, lan entuk siji ora gumantung karo liyane .

Fitur khusus sinkronisasi ing cara statis

Nanging apa yen sampeyan kudu nyinkronake cara statis ?

class MyClass {
   private static String name1 = "Ally";
   private static String name2 = "Lena";

   public static synchronized void swap() {
       String s = name1;
       name1 = name2;
       name2 = s;
   }

}
Ora jelas apa peran mutex ing kene. Sawise kabeh, kita wis nemtokake manawa saben obyek duwe mutex. Nanging masalahe yaiku kita ora butuh obyek kanggo nelpon MyClass.swap()metode kasebut: metode kasebut statis! Terus apa maneh? :/ Ora ana masalah ing kene. Pangripta Jawa wis ngurus kabeh :) Yen metode sing ngemot logika bebarengan kritis statis, banjur sinkronisasi ditindakake ing tingkat kelas. Kanggo luwih gamblang, kita bisa nulis maneh kode ing ndhuwur kaya ing ngisor iki:

class MyClass {
   private static String name1 = "Ally";
   private static String name2 = "Lena";

   public static void swap() {

       synchronized (MyClass.class) {
           String s = name1;
           name1 = name2;
           name2 = s;
       }
   }

}
Ing asas, sampeyan bisa wis panginten iki dhewe: Amarga ora ana obyek, mekanisme sinkronisasi kudu piye wae panggang menyang kelas dhewe. Lan kaya mangkene: kita bisa nggunakake kelas kanggo nyinkronake.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION