Panduan Komprehensif untuk Sinkronisasi di Java

Diterbitkan: 2022-05-20

Sebelum kita menjelaskan sinkronisasi di Java , kita harus meninjau kembali konsep multithreading secara singkat. Fitur multithreading Java memungkinkan eksekusi simultan dari dua atau lebih bagian program untuk penggunaan CPU yang maksimal. Setiap bagian dari program semacam itu adalah utas, dan utas adalah proses ringan dalam suatu proses.

Sekarang, beberapa utas program mungkin mencoba mengakses sumber daya yang sama dan menghasilkan hasil yang tidak akurat. Jadi, harus ada sinkronisasi untuk memastikan bahwa hanya satu utas yang memiliki akses ke sumber daya pada titik waktu tertentu.

Panduan tentang apa itu sinkronisasi di Java akan mengeksplorasi konsep sinkronisasi secara rinci dengan contoh-contohnya.

Daftar isi

Apa itu sinkronisasi di Jawa?

Sinkronisasi Java adalah kemampuan untuk mengontrol akses beberapa utas ke sumber daya bersama. Ini berguna ketika program Java multi-utas mencoba mengakses sumber daya yang sama dan menghasilkan hasil yang salah. Menggunakan fitur sinkronisasi Java, hanya satu utas yang dapat mengakses sumber daya pada titik waktu tertentu.

Java menyediakan cara untuk menyinkronkan tugas utas menggunakan blok tersinkronisasi yang menyinkronkan pada objek yang sama dan hanya dapat memiliki satu utas yang dieksekusi di dalamnya pada satu waktu. Blok ini ditandai dengan kata kunci yang disinkronkan, memblokir utas lain yang mencoba masuk ke blok yang disinkronkan sampai utas yang sudah ada di dalam blok mengakhiri eksekusi dan meninggalkan blok.

Sintaks untuk Menulis Blok yang Disinkronkan

Sintaks umum untuk menulis blok tersinkronisasi di Java adalah sebagai berikut:

disinkronkan (lockObject)

{

// pernyataan yang disinkronkan

}

Dalam sintaks di atas, lockObject mengacu pada objek yang kuncinya terkait dengan elemen yang disinkronkan. Sekarang, itu membawa kita ke konsep kunci di Jawa.

Kunci di Jawa

Sinkronisasi di Java dibangun di sekitar kunci atau monitor. Setiap objek memiliki kunci terkait. Idealnya, utas yang memerlukan akses ke bidang objek harus terlebih dahulu mendapatkan kunci objek. Kunci adalah mekanisme sinkronisasi utas yang lebih canggih dan fleksibel daripada blok sinkronisasi. Ini didefinisikan di dalam paket java.util.concurrent.lock yang berisi implementasi kunci ekstensif.

Pelajari kursus pengembangan perangkat lunak online dari Universitas top dunia. Dapatkan Program PG Eksekutif, Program Sertifikat Tingkat Lanjut, atau Program Magister untuk mempercepat karier Anda.

Metode Sinkronisasi Java

Tujuan metode sinkronisasi Java adalah untuk mengunci objek untuk sumber daya bersama. Jadi, ketika utas memanggil metode yang disinkronkan, metode tersebut secara otomatis mendapatkan kunci untuk objek itu dan melepaskannya setelah utas menjalankan tugasnya.

Berikut ini contoh metode sinkronisasi Java:

//contoh metode sinkronisasi java

tabel kelas{

void tersinkronisasi printTable(int n){//synchronized method

untuk(int i=1;i<=5;i++){

System.out.println(n*i);

mencoba{

Thread.sleep(400);

}catch(Pengecualian e){System.out.println(e);}

}

}

}

kelas MyThread1 memperluas Thread{

Tabel t;

MyThread1(Tabel t){

ini.t=t;

}

menjalankan kekosongan publik (){

t.printTable(5);

}

}

kelas MyThread2 memperluas Thread{

Tabel t;

MyThread2(Tabel t){

ini.t=t;

}

menjalankan kekosongan publik (){

t.printTable(100);

}

}

TestSynchronization2 kelas publik{

public static void main(String args[]){

Tabel obj = Tabel baru();//hanya satu objek

MyThread1 t1=baru MyThread1(obj);

MyThread2 t2=baru MyThread2(obj);

t1.mulai();

t2.mulai();

}

}

Keluaran:

5

10

15

20

25

100

200

300

400

500

Apa yang terjadi tanpa sinkronisasi?

Sekarang, mari kita lihat program sebelumnya tanpa sinkronisasi (perhatikan tidak adanya kata kunci yang disinkronkan).

tabel kelas{

void printTable(int n){//metode tidak disinkronkan

untuk(int i=1;i<=5;i++){

System.out.println(n*i);

mencoba{

Thread.sleep(400);

}catch(Pengecualian e){System.out.println(e);}

}

}

}

kelas MyThread1 memperluas Thread{

Tabel t;

MyThread1(Tabel t){

ini.t=t;

}

menjalankan kekosongan publik (){

t.printTable(5);

}

}

kelas MyThread2 memperluas Thread{

Tabel t;

MyThread2(Tabel t){

ini.t=t;

}

menjalankan kekosongan publik (){

t.printTable(100);

}

}

kelas TestSynchronization1{

public static void main(String args[]){

Tabel obj = Tabel baru();//hanya satu objek

MyThread1 t1=baru MyThread1(obj);

MyThread2 t2=baru MyThread2(obj);

t1.mulai();

t2.mulai();

}

}

Keluaran:

5

100

10

200

15

300

20

400

25

500

Seperti yang Anda lihat, output tidak konsisten tanpa sinkronisasi.

Jelajahi Kursus Rekayasa Perangkat Lunak Populer kami

TL. Tidak Program Pengembangan Perangkat Lunak
1 Master of Science dalam Ilmu Komputer dari LJMU & IIITB Program Sertifikat Keamanan Siber CTME Caltech
2 Bootcamp Pengembangan Tumpukan Penuh Program PG di Blockchain
3 Program Pascasarjana Eksekutif dalam Pengembangan Perangkat Lunak - Spesialisasi dalam DevOps Lihat semua Kursus Rekayasa Perangkat Lunak

Jenis Sinkronisasi di Jawa

Untuk menjawab apa itu sinkronisasi utas di Java , kami memiliki dua jenis sinkronisasi yang tersedia: sinkronisasi utas dan sinkronisasi proses.

Mari kita pahami apa artinya masing-masing.

Sinkronisasi utas: Ketika beberapa utas mencoba mengakses sumber daya bersama, kami harus memastikan bahwa sumber daya digunakan hanya oleh satu utas pada satu waktu. Sinkronisasi utas adalah proses yang mengizinkan hanya satu utas untuk menggunakan sumber daya bersama ketika beberapa utas mencoba menggunakan sumber daya secara bersamaan.

Sinkronisasi proses: Ini mengacu pada eksekusi simultan dari beberapa proses untuk mencapai keadaan di mana proses berkomitmen pada urutan eksekusi yang sesuai. Sinkronisasi proses diperlukan ketika dua atau lebih proses bekerja sama, dan eksekusi satu proses mempengaruhi proses lainnya. Dengan demikian, sinkronisasi proses menghilangkan kemungkinan output yang tidak akurat dan menjamin urutan eksekusi yang tepat.

Metode Sinkronisasi di Java

Secara garis besar, ada empat metode sinkronisasi di Java:

  • Metode statis yang disinkronkan
  • Metode instance yang disinkronkan
  • Blok yang disinkronkan di dalam metode statis
  • Blok yang disinkronkan di dalam metode instance

Mari kita lihat setiap metode sinkronisasi Java secara lebih rinci.

Metode statis yang disinkronkan

Di sini, kami menggunakan kata kunci yang disinkronkan untuk menandai metode statis di Java. Berikut ini contoh metode statis tersinkronisasi Java:

MyStaticCounter statis publik {

hitungan int statis pribadi = 0;

kenaikan void tersinkronisasi statis publik (nilai int) {

hitung += nilai;

}

}

Metode instance yang disinkronkan

Saat menggunakan blok yang disinkronkan dengan metode instan, setiap objek memiliki metode yang disinkronkan. Setiap objek hanya dapat memiliki satu utas yang dapat dieksekusi di dalam suatu metode. Jika ada beberapa objek, satu utas dapat dieksekusi untuk setiap objek di dalam blok.

MyCounter kelas publik {

jumlah int pribadi = 0;

kenaikan void yang disinkronkan publik (nilai int) {

this.count += nilai;

}

pengurangan kekosongan yang disinkronkan publik (nilai int) {

this.count -= nilai;

}

}

Blok yang disinkronkan di dalam metode statis

Di bawah ini adalah contoh di mana kami menggunakan blok yang disinkronkan di dalam metode statis:

kelas publik kelasku {

public static void print(Pesan string) {

disinkronkan(KelasSaya.kelas) {

log.writeln(pesan);

}

}

}

Blok yang disinkronkan di dalam metode instance

Alih-alih menyinkronkan seluruh metode, kita dapat menggunakan tersinkronisasi pada blok tertentu di dalam metode. Di bawah ini adalah contoh blok kode yang disinkronkan di dalam metode yang tidak disinkronkan:

kenaikan kekosongan publik (nilai int) {

disinkronkan (ini) {

this.count += nilai;

}

}

Perlu Sinkronisasi di Jawa

Sekarang setelah Anda mengetahui apa itu sinkronisasi di Java , Anda mungkin bertanya-tanya mengapa kami menggunakannya sejak awal.

Kata kunci tersinkronisasi Java menyediakan fungsionalitas penting untuk pemrograman bersamaan. Inilah cara sinkronisasi di Java membantu:

  • Sinkronisasi Java menyediakan fitur penguncian untuk menghilangkan kondisi balapan apa pun di antara utas dan memastikan akses yang saling eksklusif ke sumber daya bersama.
  • Penguncian yang disinkronkan Java menyediakan fitur penguncian dan pembukaan kunci. Jadi, utas perlu mendapatkan kunci sebelum memasukkan metode atau blok yang disinkronkan.
  • Kata kunci yang disinkronkan mencegah penyusunan ulang pernyataan program oleh kompiler.

Kesimpulan

Ringkasnya, sinkronisasi di Java memastikan bahwa hanya satu utas yang dapat mengakses sumber daya bersama pada satu waktu. Kita dapat membuat blok atau metode tersinkronisasi menggunakan kata kunci tersinkronisasi Java. Ketika sebuah utas ingin masuk ke dalam blok yang disinkronkan, ia harus mendapatkan kunci, dan setelah meninggalkan blok, utas melepaskan kunci. Kita dapat menggunakan kata kunci yang disinkronkan baik dengan metode atau di dalam blok metode.

Ingin tahu di mana belajar bahasa Jawa?

Sertifikasi PG terkait pekerjaan upGrad dalam Rekayasa Perangkat Lunak adalah apa yang Anda cari!

Dirancang khusus untuk lulusan baru dan tahun terakhir, Sertifikasi PG terkait-Pekerjaan di Rekayasa Perangkat Lunak upGrad sangat cocok bagi mereka yang ingin belajar memprogram dan ditempatkan dalam peran perangkat lunak tingkat pemula. Program online 5 bulan ini akan mengajarkan keterampilan perangkat lunak terbaik seperti Java, JavaScript, HTML5, DSA, AWS, MERN, dan banyak lagi!

T: Mengapa kami menggunakan tersinkronisasi di Java?

J: Kata kunci yang disinkronkan di Java memastikan bahwa hanya satu utas yang dapat mengakses sumber daya bersama pada satu waktu. Ini berguna ketika program Java multi-utas mencoba mengakses sumber daya yang sama dan menghasilkan hasil yang tidak akurat.

T: Bagaimana sinkronisasi diimplementasikan di Java?

J: Java mengimplementasikan sinkronisasi menggunakan konsep monitor dengan hanya satu thread yang memiliki monitor pada waktu tertentu. Ketika sebuah utas memperoleh kunci, ia mendapat akses ke monitor, dan semua utas lainnya yang mencoba masuk ke monitor yang terkunci tetap diblokir sampai utas pertama meninggalkan monitor.

T: Apa itu kebuntuan di Jawa?

J: Java deadlock terjadi ketika sebuah thread sedang menunggu sebuah object lock, tetapi thread lain memperolehnya, dan thread kedua sedang menunggu sebuah object lock yang diperoleh oleh yang pertama. Oleh karena itu, kedua utas menunggu satu sama lain untuk melepaskan kunci, menghasilkan kebuntuan.