Rumah > Java > javaTutorial > Jalan buntu di Jawa

Jalan buntu di Jawa

WBOY
Lepaskan: 2024-08-30 15:40:06
asal
932 orang telah melayarinya

Di Jawa, Deadlock ialah situasi multithreading di mana utas 1 menunggu untuk kunci objek yang dicapai oleh thread 2, dan thread 2 menunggu untuk kunci objek yang dicapai oleh thread 1. Di sini, kedua-dua thread 1 dan thread 2 menunggu antara satu sama lain untuk melepaskan kunci. Program berbilang benang dalam Java boleh menyebabkan Kebuntuan kerana kata kunci yang disegerakkan menyekat benang pelaksana sementara menunggu monitor atau kunci yang dipautkan dengan objek yang disebutkan. Mari kita lihat cara kerja dan contoh Deadlock dalam bahagian berikut.

Mulakan Kursus Pembangunan Perisian Percuma Anda

Pembangunan web, bahasa pengaturcaraan, ujian perisian & lain-lain

Bagaimana Deadlock berfungsi?

Seperti yang dibincangkan, kaedah yang disegerakkan boleh mengunci bahagian tertentu kod. Untuk setiap objek dalam Java, kunci akan berada di sana dan Penyegerakan ialah teknik untuk mengunci fungsi atau blok kod untuk memastikan hanya 1 utas boleh mengakses fungsi atau blok kod itu pada satu masa.

Apabila benang tertentu perlu melaksanakan fungsi yang disegerakkan, ia mula-mula cuba mendapatkan kunci. Pada masa yang sama, jika benang lain telah menerima kunci, benang pertama menunggu sehingga benang 2 melepaskan kunci. Walaupun Penyegerakan menghalang isu ketidakkonsistenan data, terdapat isu penyegerakan.

Anggapkan terdapat 2 utas, ‘Thread 1’ dan ‘Thread 2’. Thread 1 telah mencapai kunci Objek 1, dan Thread 2 telah mencapai kunci Objek 2. Thread 1, yang melaksanakan kaedah 1, ingin mencapai kunci pada Objek 2. Walau bagaimanapun, Thread 2 telah mencapai kunci pada Objek 2.

Selain itu, Thread 2 juga perlu mencapai kunci pada Objek 1; walau bagaimanapun, Thread 1 mempunyai kunci pada Objek 1. Di sini, kedua-dua utas, Thread 1 dan Thread 2, tidak dapat menyelesaikan pelaksanaannya dan menunggu kunci selama-lamanya. Keadaan ini dipanggil Deadlock.

Contoh Kebuntuan di Jawa

Diberikan di bawah adalah contoh yang dinyatakan:

Contoh #1

Program Java untuk melaksanakan Deadlock.

Kod:

public class DeadLockExample {
//main method
public static void main(String[] args) throws InterruptedException {
//create three objects 1, 2 and 3
Object o1 = new Object();
Object o2 = new Object();
Object o3 = new Object();
//create three threads 1, 2 and 3
Thread th1 = new Thread(new SynchronizationThread(o1, o2), "thread 1");
Thread th2 = new Thread(new SynchronizationThread(o2, o3), "thread 2");
Thread th3 = new Thread(new SynchronizationThread(o3, o1), "thread 3");
//start thread 1
th1.start();
//thread sleeps for 5000 seconds
Thread.sleep(5000);
//start thread 2
th2.start();
//thread sleeps for 5000 seconds
Thread.sleep(5000);
//start thread 3
th3.start();
}
}
class SynchronizationThread implements Runnable
{
private Object o1;
private Object o2;
public SynchronizationThread(Object o1, Object o2){
this.o1=o1;
this.o2=o2;
}
//function run
@Override
public void run() {
//store the name of the thread
String nm = Thread.currentThread().getName();
System.out.println( nm + " attaining lock on "+ o1 ) ;
synchronized (o1)
{
System.out.println( nm + " attained lock on "+ o1 ) ;
work();
System.out.println( nm + " attaining lock on "+ o2 ) ;
synchronized (o2) {
System.out.println( nm + " attained lock on "+ o2 );
work();
}
System.out.println( nm + " released lock on "+ o2 ) ;
}
System.out.println( nm + " released lock on "+ o1 ) ;
System.out.println( nm + " completed execution.") ;
}
//function work
private void work() {
try {
//thread sleeps
Thread.sleep(30000);
}
//catch the exception
catch (InterruptedException exc)
{
exc.printStackTrace();
}
}
}
Salin selepas log masuk

Output:

Jalan buntu di Jawa

Contoh #2

Dalam program ini, 3 utas yang berjalan berkongsi sumber, dan ia berjalan dengan cara yang mencapai kunci pada objek 1, tetapi apabila ia cuba mencapai kunci pada objek 2, ia masuk ke dalam keadaan menunggu. Untuk mengelakkan Deadlock, anda boleh menulis semula kod seperti berikut.

Kod:

public class DeadLockExample {
public static void main(String[] args) throws InterruptedException {
Object o1 = new Object();
Object o2 = new Object();
Object o3 = new Object();
Thread th1 = new Thread(new SynchronizationThread(o1, o2), "thread 1");
Thread th2 = new Thread(new SynchronizationThread(o2, o3), "thread 2");
Thread th3 = new Thread(new SynchronizationThread(o3, o1), "thread 3");
//start thread 1, 2 and 3
th1.start();
//thread sleeps for 5000 seconds
Thread.sleep(5000);
th2.start();
//thread sleeps for 5000 seconds
Thread.sleep(5000);
th3.start();
}
}
class SynchronizationThread implements Runnable{
private Object o1;
private Object o2;
public SynchronizationThread(Object o1, Object o2){
this.o1=o1;
this.o2=o2;
}
//function run
@Override
public void run() {
//store the name of the thread
String nm = Thread.currentThread().getName();
System.out.println( nm + " attaining lock on "+ o1 ) ;
synchronized (o1)
{
System.out.println( nm + " attained lock on "+ o1 ) ;
work();
}
System.out.println( nm + " released lock on "+ o1 ) ;
System.out.println( nm + " acquiring lock on " + o2 );
synchronized (o2) {
System.out.println( nm + " attained lock on "+ o2 );
work();
}
System.out.println( nm + " released lock on "+ o2 ) ;
System.out.println( nm + " released lock on "+ o1 ) ;
System.out.println( nm + " completed execution.") ;
}
//function work
private void work() {
try {
//thread sleeps
Thread.sleep(30000);
}
//catch the exception
catch (InterruptedException exc)
{
exc.printStackTrace();
}
}
}
Salin selepas log masuk

Output:

Jalan buntu di Jawa

Bagaimana untuk Mengelakkan Kebuntuan di Jawa?

Berikut ialah garis panduan yang membantu dalam mengelakkan situasi kebuntuan.

1. Elakkan kunci yang bersarang

Kunci bersarang adalah salah satu sebab biasa menyebabkan kebuntuan. Jangan kunci sumber lain jika ia sudah memegang satu untuk mengelakkan Deadlock. Jika pengguna bekerja dengan hanya 1 objek, adalah mustahil untuk menyebabkan kebuntuan.

2. Kunci hanya apa yang diperlukan

Orang ramai mengesyorkan mengunci hanya sumber yang diperlukan. Walau bagaimanapun, sesetengah pengguna mungkin cuba mengunci sumber walaupun tidak diperlukan.

3. Elakkan menunggu selama-lamanya

Kebuntuan berlaku jika 2 utas menunggu antara satu sama lain untuk dilengkapkan selama-lamanya dengan bantuan sambungan benang. Jika utas perlu menunggu urutan lain selesai, eloklah gunakan join dengan jumlah masa maksimum yang perlu menunggu untuk utas selesai.

Atas ialah kandungan terperinci Jalan buntu di Jawa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan