Apa itu kebuntuan
Mari kita lihat contoh kehidupan seperti itu: ada jembatan di sungai, dengan dek jembatan sempit yang hanya dapat menampung satu mobil dan tidak dapat membiarkan dua mobil secara paralel. Jika dua mobil A dan B berkendara ke jembatan dari kedua ujung jembatan, maka untuk mobil A, ia berjalan melintasi bagian jalan di sisi kiri dek jembatan (yaitu, ia menempati bagian dari sumber daya jembatan). Jika Anda ingin menyeberangi jembatan, Anda harus menunggu mobil B untuk melepaskan dek jembatan di sebelah kanan. Mobil A tidak dapat bergerak maju saat ini; Untuk mobil B, ia berjalan melintasi bagian jalan di sisi kanan dek jembatan (yaitu, ia menempati bagian dari sumber daya jembatan). Jika Anda ingin menyeberangi jembatan, Anda harus menunggu mobil A untuk melepaskan dek jembatan di sebelah kiri, dan mobil B tidak dapat bergerak maju saat ini. Mobil -mobil di kedua sisi tidak membalikkan, yang mengakibatkan saling menunggu untuk melepaskan geladak jembatan, tetapi tidak ada yang memberi jalan dan akan menunggu tanpa henti. Fenomena ini adalah kebuntuan. Jika mobil dibandingkan dengan suatu proses dan dek jembatan digunakan sebagai sumber daya, maka masalah di atas digambarkan sebagai: proses A memiliki sumber daya R1, menunggu sumber daya RR yang ditempati oleh proses B; Proses B memiliki sumber daya RR, menunggu sumber daya R1 yang ditempati oleh proses A. Selain itu, sumber daya R1 dan RR hanya memungkinkan satu proses untuk ditempati, yaitu, dua proses tidak diizinkan untuk ditempati pada saat yang sama. Akibatnya, tidak ada proses yang dapat terus mengeksekusi. Jika tidak ada tindakan lain yang diambil, situasi tunggu siklus ini akan berlanjut tanpa batas waktu, dan proses kebuntuan akan terjadi.
Dalam sistem komputer, sumber daya perangkat lunak dan perangkat keras mungkin menemui jalan buntu. Misalnya: hanya ada satu driver CD-ROM dan satu printer dalam sistem. Satu proses memiliki driver CD-ROM dan berlaku untuk printer; Proses lainnya memiliki printer dan berlaku untuk CD-ROM. Akibatnya, kedua proses diblokir dan tidak akan pernah terputus sendiri.
Kebuntuan yang disebut mengacu pada situasi di mana banyak proses bersepeda melalui sumber daya yang mereka tempati dan tetap dalam kebuntuan tanpa batas waktu. Jelas, jika tidak ada kekuatan eksternal, maka semua proses yang terlibat dalam kebuntuan akan selalu diblokir. Dari contoh di atas, kita dapat melihat bahwa alasan mendasar untuk kebuntuan dalam sistem komputer adalah sumber daya yang terbatas dan operasi yang tidak tepat. Artinya: salah satu alasannya adalah bahwa sistem menyediakan terlalu sedikit sumber daya dan jauh dari memenuhi persyaratan sumber daya dari proses bersamaan. Kebuntuan yang disebabkan oleh sumber daya yang bersaing ini adalah inti dari diskusi kami. Misalnya: Pesan adalah sumber daya sementara. Pada titik tertentu, proses A sedang menunggu pesan yang dikirim oleh proses B, Proses B sedang menunggu pesan yang dikirim oleh proses C, dan Proses C sedang menunggu pesan yang dikirim oleh Proses A. Jika pesan belum tiba, tidak satu pun dari tiga proses A, B, dan C tidak dapat bergerak maju, dan kebuntuan juga akan terjadi dalam komunikasi proses. Alasan lain adalah kebuntuan yang disebabkan oleh perintah kemajuan proses yang tidak pantas. Sumber daya kecil mungkin tidak harus menyebabkan kebuntuan. Sama seperti dua orang yang melintasi jembatan satu papan, jika keduanya harus lulus lebih dulu dan kebuntuan di jembatan satu papan, mereka pasti akan mengarah ke kebuntuan untuk sumber daya kompetisi; Namun, jika dua orang pertama -tama memeriksa apakah ada orang lain di jembatan sebelum pergi ke jembatan, dan hanya naik jembatan sendiri ketika tidak ada orang lain di jembatan, maka masalahnya akan diselesaikan. Oleh karena itu, jika program ini dirancang secara tidak masuk akal dan prosesnya dipromosikan secara tidak tepat, itu juga akan menyebabkan kebuntuan.
Jalan buntu
Hanya ketika utas T1 menempati O1 dan juga membutuhkan O2, dan T2 mengambil O2 saat ini dan juga membutuhkan O1 akan ada jalan buntu. (Mirip dengan dua orang makan dengan dua sumpit, mereka berdua membutuhkan satu sumpit dari pesta lain untuk makan)
Kode berikut: Utas T1 menempati O1 dan hanya melepaskan O1 setelah mendapatkan objek O2. Utas T2 menempati O2 terlebih dahulu dan kemudian memperoleh O1. Pada saat ini, O1 ditempati oleh utas T1, O2 ditempati oleh utas T2, T1 dan T2 menunggu tanpa batas, dan kebuntuan akan terjadi.
Paket javasimple;/** * demo deadlock * @author haokui * */kelas publik diesynchronized {public static void main (string [] args) {/** * Buat dan mulai dua utas T1 dan T2. Kedua utas harus berbagi dua objek O1 dan O2*/ Objek O1 = Objek Baru (); Objek o2 = objek baru (); Utas T1 = utas baru (T1 baru (O1, O2)); Utas T2 = utas baru (T2 baru (O1, O2)); t1.start (); t2.start (); }} // Buat dua kelas utas T1 mengimplementasikan runnable {objek o1; Objek o2; publik t1 (objek o1, objek o2) {this.o1 = o1; this.o2 = o2; } public void run () {// mengunci O1 dan O2 disinkronkan (O1) {coba {thread.sleep (1000); } catch (InterruptedException E) {// TODO Auto-Encanerated Catch Block E.PrintStackTrace (); } disinkronkan (o2) {System.out.println ("o2"); }}}}}}} kelas T2 mengimplementasikan runnable {objek o1; Objek o2; publik t2 (objek o1, objek o2) {this.o1 = o1; this.o2 = o2; } public void run () {disinkronkan (o2) {coba {thread.sleep (1000); } catch (InterruptedException E) {// TODO Auto-Encanerated Catch Block E.PrintStackTrace (); } disinkronkan (o1) {System.out.println ("o1"); }}}} Catatan: Konkurensi hanya terjadi ketika O1 dan O2 dibagikan. Dua objek dapat dibagikan melalui konstruktor.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.