Penyegerakan di Java: Apa, Bagaimana dan Mengapa?



Artikel ini mengenai Penyegerakan di Java akan membantu anda membimbing cara anda untuk belajar mengenai menyegerakkan program berbilang benang.

Program berbilang ulir secara berkala boleh muncul dengan keadaan di mana banyak berusaha untuk mendapatkan sumber yang sama yang menghasilkan hasil penipuan dan mengejutkan. Ini dapat diselesaikan dengan menggunakan penyegerakan di Java. Hanya satu utas tertentu yang dapat mencapai sumber tersebut pada satu jangka masa tertentu. Artikel ini akan membantu anda membiasakan diri dengan strategi penyegerakan.

iso 9000 vs six sigma

Saya akan membincangkan topik mengikut urutan ini:





Mari kita mulakan!

Mengapa menggunakan Penyegerakan di Java?



Sekiranya anda memulakan dengan sekurang-kurangnya dua utas di dalam program, mungkin ada kemungkinan apabila banyak utas berusaha untuk mendapatkan sumber yang sama. Bahkan boleh menghasilkan hasil yang tidak dijangka kerana masalah bersamaan.

Sintaks :

disegerakkan (pengecam objek) {// Akses pemboleh ubah bersama dan sumber kongsi lain}

Sebagai contoh, cuba menulis dalam fail yang setara. Ini mungkin merosakkan data kerana salah satu utas dapat mengganti data atau ketika utas membukafail yang sama pada masa yang sama, utas lain mungkin menutup fail yang sama.Terdapat keperluan untuk menyegerakkan tindakan pelbagai utas. Ini dapat dilaksanakan dengan menggunakan konsep yang disebut M pengawas .



  • Masing-masing dikaitkan dengan monitor, yang boleh dikunci atau dibuka oleh utas.
  • Hanya satu utas pada satu masa yang dapat menahan kunci pada monitor.
  • Jawa bahasa pengaturcaraan menyediakan cara yang sangat berguna untuk membuat utas dan menyegerakkan tugas mereka dengan menggunakan Disegerakkan blok.
  • Ia juga menyimpan sumber yang dikongsi dalam blok tertentu ini.

Blok yang disegerakkan di Java ditandai dengan Disegerakkan kata kunci. Blok di Java ini diselaraskan pada beberapa objek.Semua blok yang diselaraskan pada objek yang sama hanya boleh mempunyai satu utas yang dijalankan di dalamnya pada satu masa. Semua utas lain yang cuba memasuki blok yang disegerakkan disekat sehingga utas di dalam blok yang disegerakkan keluar dari blok tersebut.

Jenis Penyegerakan

Pada dasarnya terdapat dua jenis penyegerakan yang ada. Mereka adalah:

  1. Penyegerakan Proses: Pelaksanaan serentak beberapa utas atau proses untuk mencapai keadaan sehingga mereka melakukan urutan tindakan tertentu.
  2. Penyegerakan Thread: Pada masa-masa apabila lebih daripada satu utascuba mengakses sumber yang dikongsi, anda perlu memastikan bahawa sumber itu akan digunakan oleh hanya satu utas dimasa.

Jangan sampai ke perincian jenis ini dan cuba memahami apa yang menjadi kunci .

Kunci di Jawa

Seperti yang saya nyatakan sebelumnya, Penyegerakan dibangun di sekitar entiti dalaman yang dikenali sebagai kunci atau memantau . Setiap objek mempunyai kunci yang berkaitan dengannya. Oleh itu, utas yang memerlukan akses yang konsisten ke medan objek perlu memperoleh kunci objek sebelum mengaksesnya, dan kemudian lepaskan kunci ketika kerja selesai.

Dari Java 5, paket java.util.concurrent.locks mengandungi banyak implementasi kunci.

Begini rupa kunci:

kunci kelas awam {private boolean isLocked = kunci kosong yang disegerakkan awam palsu () melemparkan InterruptException {while (isLocked) {waiting ()} isLocked = true} buka kunci tidak disegerakkan awam () {isLocked = false notify ()}}

Kaedah kunci () mengunci contoh Kunci sehingga semua kunci panggilan utas () disekat sehingga buka kunci () dijalankan.

Berbilang benang tanpa Penyegerakan

Berikut adalah contoh mudah yang mencetak nilai pembilang secara berurutan dan setiap kali kita menjalankannya, ia menghasilkan hasil yang berbeza berdasarkan ketersediaan CPU ke utas. Lihat ini!

kelas Multithread {public void printCount () {cuba {untuk (int i = 5 i<0 i--) { System.out.println('Counter --- ' + i ) } } catch (Exception e) { System.out.println('Thread interrupted.') } } } class Thread extends Multithread { private Thread t private String threadName Multithread MT Thread( String name, Multithread mt) { threadName = name MT= mt } public void run() { MT.printCount() System.out.println('Thread ' + threadName + ' exiting.') } public void start () { System.out.println('Starting ' + threadName ) if (t == null) { t = new Thread (this, threadName) t.start () } } } public class TestThread { public static void main(String args[]) { Multithread MT = new Multithread() Thread t = new Thread( 'Thread - 1 ', MT) Thread t1 = new Thread( 'Thread - 2 ', MT) t.start() t1.start() // wait for threads to end try { t.join() t1.join() } catch ( Exception e) { System.out.println('Interrupted') } } }

Hasil program di atas menghasilkan:

Output- Penyegerakan di Java- Edureka

Berbilang benang dengan Penyegerakan

Ini adalah contoh yang sama seperti di atas tetapi mencetak nilai pembilang mengikut urutan. Setiap kali kita menjalankannya, ia menghasilkan hasil yang sama.

kelas Multithread {public void printCount () {try {for (int i = 5 i> 0 i--) {System.out.println ('Counter ---' + i)}} tangkapan (Pengecualian e) {Sistem. out.println ('Thread interrupt.')}}} kelas Thread meluas Multithread {private Thread t private String threadName Multithread MT Thread (String name, Multithread mt) {threadName = name MT = mt} public void run () {diselaraskan ( MT) {MT.printCount ()} System.out.println ('Thread' + threadName + 'exiting.')} Permulaan kosong awam () {System.out.println ('Start' + threadName) jika null) {t = Thread baru (ini, threadName) t.start ()}}} kelas awam TestThread {public static void main (String args []) {Multithread MT = Multithread baru () Thread T = Thread baru ('Thread - 1 ', MT) Thread T1 = Thread baru (' Thread - 2 ', MT) T.start () T1.start () // tunggu benang berakhir cuba {T.join () T1.join ()} tangkapan (Pengecualian e) {System.out.println ('Interrupt')}}}

Hasilnya digambarkan di bawah:

Kata kunci yang disegerakkan

kata kunci yang disegerakkan menandakan blok atau kaedah bahagian kritikal. Bahagian kritikal adalah di mana hanya satu utas dijalankan pada satu masa, dan utas memegang kunci untuk bahagian yang disegerakkan. Ini disegerakkan kata kunci membantu dalam penulisan serentak bahagian mana-mana aplikasi. Ia juga melindungi sumber yang dikongsi dalam blok tersebut.

Kata kunci yang disegerakkan boleh digunakan dengan:

Mari kita bincangkan blok kod.

Kata Kunci Disegerakkan: Sekatan kod

Sintaks

Sintaks umum untuk menulis blok yang disegerakkan adalah:

disegerakkan (lockObject) {// penyataan yang disegerakkan}

Apabila utas ingin melaksanakan penyataan yang disegerakkan di dalam blok, ia mesti memperoleh kunci pada monitor lockObject. Hanya satu utas yang dapat memperoleh monitor objek kunci pada satu masa. Oleh itu, semua utas lain mesti menunggu sehingga utas yang sedang dijalankan memperoleh kunci dan menyelesaikan pelaksanaannya.
Dengan cara ini, yang disegerakkan kata kunci menjamin bahawa hanya satu utas yang akan melaksanakan penyataan blok yang disegerakkan pada satu masa, dan dengan itu mencegah beberapa utas merosakkan data yang dikongsi yang terdapat di dalam blok tersebut.

Catatan :

  • Sekiranya benang dihidupkan (menggunakan tidur () kaedah) maka ia tidak melepaskan kunci. Semasa waktu tidur ini, tidak ada utas yang akan melaksanakan penyataan blok yang disegerakkan.
  • Penyegerakan Java akan membuang NullPointerException jika objek kunci digunakan dalam ‘ disegerakkan (kunci) 'Adalah batal.

Sekarang, mari kita bincangkan kaedahnya.

Kata kunci yang disegerakkan: Kaedah

Sintaks

Sintaks umum untuk menulis a kaedah segerak adalah:

kaedah disegerakkan (parameter) {// kod disegerakkan}

Di sini kunciObjek hanyalah rujukan ke objek yang kuncinya dikaitkan dengan monitor yang mewakili pernyataan yang diselaraskan.

Sama dengan blok yang disegerakkan, utas mesti memperoleh kunci pada objek monitor yang disambungkan dengan kaedah yang disegerakkan. Sekiranya kaedah disegerakkan, objek kunci adalah:

  • Objek ‘.class’ - jika kaedah yang diberikan adalah statik .
  • Objek 'ini' - jika kaedahnya tidak statik . 'Ini' adalah rujukan ke objek semasa di mana kaedah penyegerakan dipanggil.

Kata kunci disegerakkan Java adalah masuk semula dalam alam semula jadi. Ini bermaksud jika kaedah yang diselaraskan memanggil kaedah lain yang diselaraskan yang memerlukan kunci yang sama, maka utas semasa yang memegang kunci dapat masuk ke dalam kaedah itu tanpa memperoleh kunci.

Mari kita menuju ke topik akhir artikel ini dan menunjukkan perbezaan utama antara kata kunci yang disegerakkan dan blok penyegerakan.

Perbezaan antara kata kunci yang disegerakkan dan blok yang disegerakkan

  • Apabila anda menggunakan kata kunci yang disegerakkan dengan a kaedah , ia memperoleh kunci dalam objek untuk keseluruhan kaedah. Ini bermaksud bahawa tidak ada benang lain yang dapat menggunakan kaedah yang diselaraskan sehingga utas semasa yang dipanggil selesai pelaksanaannya.
  • Disegerakkan sekatan memperoleh kunci dalam objek hanya antara tanda kurung setelah kata kunci yang disegerakkan ditentukan. Ini bermaksud bahawa tidak ada utas lain yang dapat memperoleh kunci pada objek yang sudah terkunci sehingga blok keluar. Tetapi utas lain akan dapat mengakses kod selebihnya yang terdapat dalam kaedah ini.

Ini membawa kita ke akhir artikel ini di mana kita telah membincangkan bagaimana sebenarnya Penyegerakan di Java berfungsi. Semoga anda jelas dengan semua yang telah dikongsi dengan anda dalam tutorial ini.

Lihat oleh Edureka, sebuah syarikat pembelajaran dalam talian yang dipercayai dengan rangkaian lebih daripada 250,000 pelajar berpuas hati yang tersebar di seluruh dunia. Kami di sini untuk membantu anda dalam setiap langkah dalam perjalanan anda, kerana selain daripada soalan wawancara java ini, kami menyediakan kurikulum yang dirancang untuk pelajar dan profesional yang ingin menjadi Pembangun Java.

Ada soalan untuk kami? Tolong sebutkan di bahagian komen 'Sinkronisasi di Jawa' ini ' artikel dan kami akan menghubungi anda secepat mungkin.