Sinkronisasi di Java: Apa, Bagaimana dan Mengapa?



Artikel tentang Sinkronisasi di Java ini akan membantu Anda memandu cara Anda mempelajari tentang sinkronisasi program multi-utas.

Program multi-utas mungkin secara teratur menghasilkan situasi di mana banyak mencoba untuk mendapatkan sumber daya yang sama yang menghasilkan hasil yang curang dan mengejutkan. Ini dapat diselesaikan dengan menggunakan sinkronisasi di Jawa. Hanya satu utas tertentu yang dapat mencapai sumber daya pada tujuan waktu tertentu. Artikel ini akan membantu Anda memahami strategi sinkronisasi.

Saya akan membahas topik dalam urutan ini:





Ayo mulai!

Mengapa menggunakan Sinkronisasi di Java?



Jika Anda memulai dengan setidaknya dua utas di dalam sebuah program, mungkin ada peluang ketika beberapa utas mencoba masuk ke sumber daya yang sama. Itu bahkan dapat membuat hasil yang tidak terduga karena masalah konkurensi.

Sintaksis :

disinkronkan (objectidentifier) ​​{// Akses variabel bersama dan sumber daya bersama lainnya}

Sebagai contoh, mencoba untuk menulis dalam file yang setara. Ini dapat merusak data karena salah satu utas dapat menimpa data atau ketika utas membukafile yang sama pada saat yang sama, utas lain mungkin menutup file yang sama.Ada kebutuhan untuk menyinkronkan tindakan beberapa utas. Ini dapat diimplementasikan dengan menggunakan konsep yang disebut M penonton .



  • Setiap dikaitkan dengan monitor, yang dapat dikunci atau dibuka oleh utas.
  • Hanya satu utas pada satu waktu yang dapat menahan kunci pada monitor.
  • Jawa bahasa pemrograman menyediakan cara yang sangat berguna untuk membuat utas dan menyinkronkan tugas mereka dengan menggunakan ekstensi Disinkronkan blok.
  • Itu juga menyimpan sumber daya bersama dalam blok khusus ini.

Blok yang disinkronkan di Jawa ditandai dengan Disinkronkan kata kunci. Blok di Java ini disinkronkan pada beberapa objek.Semua blok yang disinkronkan pada objek yang sama hanya dapat memiliki satu utas yang dieksekusi di dalamnya pada satu waktu. Semua utas lain yang mencoba memasuki blok tersinkronisasi diblokir hingga utas di dalam blok tersinkronisasi keluar dari blok.

Jenis Sinkronisasi

Pada dasarnya ada dua jenis sinkronisasi yang tersedia. Mereka:

  1. Proses Sinkronisasi: Eksekusi simultan dari beberapa utas atau proses untuk mencapai keadaan sedemikian rupa sehingga mereka berkomitmen ke urutan tindakan tertentu.
  2. Sinkronisasi Benang: Pada saat lebih dari satu utasmencoba mengakses sumber daya bersama, Anda perlu memastikan bahwa sumber daya hanya akan digunakan oleh satu utas disebuah waktu.

Mari kita tidak membahas detail jenis ini dan mencoba memahami apa itu kunci .

Kunci di Java

Seperti yang saya sebutkan sebelumnya, Sinkronisasi dibangun di sekitar entitas internal yang dikenal sebagai mengunci atau monitor . Setiap objek memiliki kunci yang terkait dengannya. Jadi, utas yang membutuhkan akses konsisten ke bidang objek perlu mendapatkan kunci objek sebelum mengaksesnya, dan kemudian melepaskan kunci saat pekerjaan selesai.

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

Seperti inilah tampilan kunci:

kunci kelas publik {private boolean isLocked = false public disinkronkan void lock () melempar InterruptedException {sementara (isLocked) {tunggu ()} isLocked = true} publik disinkronkan void unlock () {isLocked = false notify ()}}

Metode lock () mengunci instance Lock sehingga semua utas yang memanggil lock () diblokir hingga unlock () dijalankan.

Multi-threading tanpa Sinkronisasi

Berikut adalah contoh sederhana yang mencetak nilai counter secara berurutan dan setiap kali kita menjalankannya, menghasilkan hasil yang berbeda berdasarkan ketersediaan CPU untuk sebuah thread. Lihat ini!

kelas Multithread {public void printCount () {coba {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 adalah:

Output- Sinkronisasi di Jawa- Edureka

Multi-threading dengan Sinkronisasi

Ini adalah contoh yang sama seperti di atas tetapi mencetak nilai penghitung dalam urutan. Setiap kali kami menjalankannya, hasilnya sama.

class Multithread {public void printCount () {coba {untuk (int i = 5 i> 0 i--) {System.out.println ('Counter ---' + i)}} catch (Exception e) {System. out.println ('Thread interrupted.')}}} kelas Thread extends Multithread {private Thread t private String threadName Multithread MT Thread (Nama string, Multithread mt) {threadName = name MT = mt} public void run () {sinkron ( MT) {MT.printCount ()} System.out.println ('Thread' + threadName + 'exiting.')} Public void start () {System.out.println ('Starting' + threadName) if (t == null) {t = Thread baru (ini, threadName) t.start ()}}} kelas publik TestThread {public static void main (String args []) {Multithread MT = new Multithread () Thread T = new Thread ('Thread - 1 ', MT) Thread T1 = Thread baru (' Thread - 2 ', MT) T.start () T1.start () // tunggu hingga thread berakhir coba {T.join () T1.join ()} catch (Exception e) {System.out.println ('Interrupted')}}}

Outputnya digambarkan di bawah ini:

Kata Kunci Tersinkron

kata kunci tersinkronisasi menandai blok atau metode bagian kritis. Bagian kritis adalah tempat hanya satu utas yang dijalankan pada satu waktu, dan utas memegang kunci untuk bagian yang disinkronkan. Ini disinkronkan kata kunci membantu dalam menulis bersamaan bagian dari aplikasi apa pun. Itu juga melindungi sumber daya bersama di dalam blok.

Kata kunci tersinkronisasi dapat digunakan dengan:

Mari kita bahas blok kode.

Kata Kunci Tersinkron: Sebuah blok kode

Sintaksis

Sintaks umum untuk menulis blok tersinkronisasi adalah:

tersinkronisasi (lockObject) {// pernyataan tersinkron}

Saat utas ingin mengeksekusi pernyataan yang disinkronkan di dalam blok, utas harus memperoleh kunci pada monitor lockObject. Hanya satu utas yang dapat memperoleh monitor objek kunci dalam satu waktu. Jadi semua utas lainnya harus menunggu hingga utas yang saat ini dieksekusi memperoleh kunci dan menyelesaikan eksekusinya.
Dengan cara ini, disinkronkan kata kunci menjamin bahwa hanya satu utas yang akan menjalankan pernyataan blok tersinkronisasi pada satu waktu, dan dengan demikian mencegah beberapa utas merusak data bersama yang ada di dalam blok.

Catatan :

  • Jika utas tertidur (menggunakan tidur() metode) maka itu tidak membuka kunci. Selama waktu tidur ini, tidak ada utas yang akan menjalankan pernyataan blok tersinkronisasi.
  • Sinkronisasi Java akan membuang NullPointerException jika kunci objek digunakan dalam ' tersinkronisasi (kunci) 'Adalah nol.

Sekarang, mari kita bahas metodenya.

Kata Kunci Tersinkron: Sebuah metode

Sintaksis

Sintaks umum untuk menulis a metode tersinkronisasi aku s:

metode tersinkronisasi (parameter) {// kode tersinkron}

Sini lockObject hanyalah referensi ke objek yang kuncinya terkait dengan monitor yang mewakili pernyataan yang disinkronkan.

Mirip dengan blok tersinkronisasi, utas harus memperoleh kunci pada objek monitor yang terhubung dengan metode tersinkronisasi. Dalam kasus metode tersinkronisasi, objek kunci adalah:

  • Objek '.class' - jika metode yang diberikan adalah statis .
  • Objek 'ini' - jika metodenya non-statis . 'Ini' adalah referensi ke objek saat ini di mana metode tersinkronisasi dipanggil.

Kata kunci tersinkronisasi Java adalah peserta kembali di alam. Artinya, jika metode tersinkronisasi memanggil metode tersinkronisasi lain yang memerlukan kunci yang sama, maka utas saat ini yang menahan kunci dapat masuk ke metode tersebut tanpa mendapatkan kunci.

Mari kita lanjutkan ke topik terakhir artikel ini dan tunjukkan perbedaan utama antara kata kunci tersinkronisasi dan blok sinkronisasi.

Perbedaan antara kata kunci tersinkronisasi dan blok tersinkronisasi

  • Saat Anda menggunakan kata kunci tersinkronisasi dengan file metode , itu memperoleh kunci di objek untuk seluruh metode. Ini berarti bahwa tidak ada utas lain yang dapat menggunakan metode tersinkronisasi apa pun hingga utas saat ini yang dipanggil menyelesaikan eksekusinya.
  • Disinkronkan blok memperoleh kunci di objek hanya di antara tanda kurung setelah kata kunci yang disinkronkan ditentukan. Ini berarti bahwa tidak ada utas lain yang bisa mendapatkan kunci pada objek yang sudah terkunci sampai blok tersebut keluar. Tetapi utas lain akan dapat mengakses sisa kode yang ada dalam metode.

Ini membawa kita ke akhir artikel ini di mana kita telah membahas bagaimana tepatnya Sinkronisasi di Java bekerja. Harap Anda jelas dengan semua yang telah dibagikan dengan Anda dalam tutorial ini.

cara menggunakan anaconda untuk python

Lihat oleh Edureka, perusahaan pembelajaran online tepercaya dengan jaringan lebih dari 250.000 pelajar yang puas dan tersebar di seluruh dunia. Kami di sini untuk membantu Anda dengan setiap langkah dalam perjalanan Anda, selain pertanyaan wawancara java ini, kami hadir dengan kurikulum yang dirancang untuk siswa dan profesional yang ingin menjadi Pengembang Java.

Ada pertanyaan untuk kami? Harap sebutkan di bagian komentar “Sinkronisasi di Java ' artikel dan kami akan menghubungi Anda kembali sesegera mungkin.