JavaRush /Blog Jawa /Random-JV /Sinkronisasi thread. Operator sing disinkronake ing Jawa

Sinkronisasi thread. Operator sing disinkronake ing Jawa

Diterbitake ing grup
Hello! Dina iki kita bakal terus nimbang fitur program multi-threaded lan pirembagan bab sinkronisasi thread.
Sinkronisasi thread.  Operator disinkronake - 1
Apa "sinkronisasi"? Ing njaba wilayah pemrograman, iki nuduhake sawetara persiyapan sing ngidini rong piranti utawa program bisa digunakake bebarengan. Contone, smartphone lan komputer bisa disinkronake karo akun Google, lan akun pribadhi ing situs web bisa disinkronake karo akun ing jaringan sosial supaya bisa mlebu nggunakake. Sinkronisasi benang nduweni teges sing padha: yaiku nyetel cara benang sesambungan. Ing kuliah sadurunge, utas kita urip lan kerja kanthi kapisah. Sing siji ngetung, sing nomer loro turu, sing nomer telu nampilake barang ing konsol, nanging ora sesambungan. Ing program nyata, kahanan kaya mengkono langka. Saperangan Utas bisa aktif, contone, karo pesawat padha data lan ngganti soko ing. Iki nggawe masalah. Bayangake manawa sawetara benang nulis teks menyang lokasi sing padha, kayata file teks utawa konsol. File utawa konsol iki ing kasus iki dadi sumber daya sing dienggo bareng. Utas ora ngerti babagan eksistensi saben liyane, mula dheweke mung nulis kabeh sing bisa diatur ing wektu sing diwenehake dening panjadwal thread. Ing kuliah anyar saka mesthi, kita duwe conto apa iki bakal mimpin kanggo, ayo padha elinga: Sinkronisasi thread.  Operator sing disinkronake - 2Alesane dumunung ing kasunyatan sing Utas makarya karo sumber daya sambungan, console, tanpa koordinasi tumindak karo saben liyane. Yen panjadwal thread wis diparengake wektu kanggo Thread-1, iku langsung nulis kabeh kanggo console. Utas liyane sing wis bisa ditulis utawa durung bisa ditulis ora penting. Asil, minangka sampeyan bisa ndeleng, punika bilai. Mulane, ing pemrograman multi-threaded, mutex konsep khusus dienal (saka basa Inggris "mutex", "mutual exclusion" - "mutual exclusion") . Tujuan saka mutex yaiku nyedhiyakake mekanisme supaya mung siji utas sing nduweni akses menyang obyek ing wektu tartamtu. Yen Utas-1 wis entuk mutex obyek A, Utas liyane ora bakal duwe akses kanggo ngganti apa wae ing. Nganti mutex obyek A dirilis, benang sing isih ana bakal dipeksa ngenteni. Conto urip nyata: mbayangno sampeyan lan 10 wong liyo liyane melu latihan. Sampeyan kudu gantian nyatakake gagasan lan ngrembug babagan. Nanging, amarga sampeyan sepisanan ndeleng saben liyane, supaya ora terus-terusan interupsi lan ora dadi keributan, sampeyan nggunakake aturan "bal ngomong": mung siji wong sing bisa ngomong - sing duwe bal. tangané. Kanthi cara iki dhiskusi kasebut dadi cukup lan bisa ngasilake. Dadi, mutex, ing intine, minangka bal kasebut. Yen mutex obyek ana ing tangan siji utas, utas liyane ora bakal bisa ngakses obyek kasebut. Sampeyan ora perlu nindakake apa-apa kanggo nggawe mutex: wis dibangun ing kelas Object, tegese saben obyek ing Jawa duwe.

Carane operator sing disinkronake ing Jawa

Ayo dadi kenalan karo tembung kunci anyar - disinkronake . Iki menehi tandha bagean tartamtu saka kode kita. Yen blok kode ditandhani nganggo tembung kunci sing disinkronake, tegese blok kasebut mung bisa dieksekusi kanthi siji utas. Sinkronisasi bisa ditindakake kanthi cara sing beda-beda. Contone, nggawe kabeh cara sing disinkronake:
public synchronized void doSomething() {

   //...method logic
}
Utawa nulis blok kode ing ngendi sinkronisasi ditindakake ing sawetara obyek:
public class Main {

   private Object obj = new Object();

   public void doSomething() {

       //...some logic available to all threads

       synchronized (obj) {

           //logic that is only available to one thread at a time
       }
   }
}
Tegesipun prasaja. Yen siji utas mlebu blok kode sing ditandhani karo tembung sing disinkronake, iku langsung entuk mutex obyek, lan kabeh utas liyane sing nyoba mlebu blok utawa metode sing padha dipeksa ngenteni nganti thread sadurunge ngrampungake karyane lan ngeculake ngawasi. Sinkronisasi thread.  Operator sing disinkronake - 3Miturut cara! Ing kuliah kursus sampeyan wis ndeleng conto sing disinkronake, nanging katon beda:
public void swap()
{
   synchronized (this)
   {
       //...method logic
   }
}
Topik anyar kanggo sampeyan, lan mesthi bakal ana kebingungan karo sintaksis ing wiwitan. Mula, enggal-enggal elinga supaya ora bingung mengko bab cara nulis. 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 obyek this, yaiku, kanthi obyek saiki. Lan ing conto kapindho sampeyan sijine tembung sing disinkronake ing kabeh cara. Ora ana maneh prelu nuduhake kanthi jelas obyek sing bakal ditindakake sinkronisasi. Sawise kabeh metode ditandhani nganggo tembung, metode iki bakal diselarasake kanthi otomatis kanggo kabeh obyek kelas. Ayo ora nliti diskusi babagan cara sing luwih apik. Saiki, pilih sing paling disenengi :) Ingkang utama yaiku elinga: sampeyan bisa ngumumake metode sing disinkronake mung nalika kabeh logika ing njero dieksekusi dening siji utas ing wektu sing padha. Contone, ing kasus iki doSomething()bakal dadi kesalahan kanggo nggawe cara sing disinkronake:
public class Main {

   private Object obj = new Object();

   public void doSomething() {

       //...some logic available to all threads

       synchronized (obj) {

           //logic that is only available to one thread at a time
       }
   }
}
Nalika sampeyan bisa ndeleng, Piece saka cara ngandhut logika sing sinkronisasi ora dibutuhake. Kode kasebut bisa dieksekusi dening sawetara utas bebarengan, lan kabeh panggonan kritis diparengake menyang blok sinkronisasi sing kapisah. Lan siji wayahe. Ayo katon ing mikroskop ing conto saka kuliah kanthi ijol-ijolan jeneng:
public void swap()
{
   synchronized (this)
   {
       //...method logic
   }
}
Wigati dimangerteni: sinkronisasi ditindakake nggunakake this. Yaiku, kanggo obyek tartamtu MyClass. Bayangake yen kita duwe 2 utas ( Thread-1lan Thread-2) lan mung siji obyek MyClass myClass. Ing kasus iki, yen Thread-1cara disebut myClass.swap(), mutex obyek bakal sibuk, lan Thread-2nalika sampeyan nyoba kanggo nelpon, myClass.swap()iku bakal nyumerepi nunggu mutex dadi free. Yen kita duwe 2 utas lan 2 obyek MyClass- myClass1lan myClass2- ing macem-macem obyek, utas kita bisa kanthi gampang nglakokake metode sing disinkronake. Utas pisanan nindakake:
myClass1.swap();
Sing nomer loro nindakake:
myClass2.swap();
Ing kasus iki, tembung kunci sing disinkronake ing metode kasebut swap()ora bakal mengaruhi operasi program, amarga sinkronisasi ditindakake ing obyek tartamtu. Lan ing kasus terakhir, kita duwe obyek 2. Mulane, benang ora nggawe masalah kanggo saben liyane. Sawise kabeh, rong obyek duwe 2 mutex sing beda, lan panangkepan kasebut ora gumantung ing siji liyane.

Fitur sinkronisasi ing cara statis

Nanging apa yen sampeyan kudu nyinkronake cara statis?
class MyClass {
   private static String name1 = "Olya";
   private static String name2 = "Lena";

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

}
Ora jelas apa sing bakal dadi mutex ing kasus iki. Sawise kabeh, kita wis mutusake manawa saben obyek duwe mutex. Nanging masalah iku kanggo nelpon cara statis MyClass.swap()kita ora perlu obyek: cara statis! Dadi, apa sabanjure? :/ Bener, ora ana masalah karo iki. Pencipta Jawa wis ngurus kabeh :) Yen metode sing ngemot logika kritis "multithreaded" statis, sinkronisasi bakal ditindakake dening kelas. Kanggo luwih cetha, kode ing ndhuwur bisa ditulis maneh minangka:
class MyClass {
   private static String name1 = "Olya";
   private static String name2 = "Lena";

   public static void swap() {

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

}
Ing asas, sampeyan bisa uga wis mikir bab iki dhewe: amarga ora ana obyek, mekanisme sinkronisasi kudu piye wae "hardwired" menyang kelas dhewe. Mangkene: sampeyan uga bisa nyinkronake kabeh kelas.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION