Rumah > Soal Jawab > teks badan
package test;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;
/**
* Created by rhwayfun on 16-4-3.
*/
public class ThreadTest {
private static DateFormat format = new SimpleDateFormat("HH:mm:ss");
public synchronized void tryOther(ThreadTest other) throws InterruptedException {
System.out.println(Thread.currentThread().getName() + " enter tryOther method at " + format.format(new Date()));
System.out.println(Thread.currentThread().getName() + " tryOther method is about to invoke other method at " + format.format(new Date()));
other.other();
}
public synchronized void other() throws InterruptedException {
System.out.println(Thread.currentThread().getName() + " enter other method atatatatat " + format.format(new Date()));
}
public static void main(String[] args) throws InterruptedException {
final ThreadTest d1 = new ThreadTest();
final ThreadTest d2 = new ThreadTest();
Thread t1 = new Thread(new Runnable() {
public void run() {
try {
d1.tryOther(d2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "threadA");
Thread t2 = new Thread(new Runnable() {
public void run() {
try {
d2.tryOther(d1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "threadB");
t1.start();
//让threadA先运行一秒
TimeUnit.SECONDS.sleep(1);
t2.start();
}
}
如上,随便找的产生死锁的代码,问题:
TimeUnit.SECONDS.sleep(1);加上这行后,不存在死锁问题。sleep并不释放锁,为何这边死锁情况会消失。
输出结果为:
threadA enter tryOther method at 15:37:39
threadA tryOther method is about to invoke other method at 15:37:39
threadA enter other method atatatatat 15:37:39
threadB enter tryOther method at 15:37:40
threadB tryOther method is about to invoke other method at 15:37:40
threadB enter other method atatatatat 15:37:40
注掉这行,正常死锁。
输出结果为:
threadB enter tryOther method at 15:37:10
threadA enter tryOther method at 15:37:10
threadB tryOther method is about to invoke other method at 15:37:10
threadA tryOther method is about to invoke other method at 15:37:10
大家讲道理2017-04-18 10:56:48
Benang A mendapat kunci tryLain, tetapi ia masih perlu mendapatkan kunci yang lain
Benang B mendapat kunci cubaLain, tetapi ia masih perlu mendapatkan kunci yang satu lagi kunci dan B baru sahaja mengeluarkan tryOther
Pada masa ini, tetapi mereka semua mahu memperoleh kunci yang lain pada masa yang sama, tiada siapa yang akan membiarkan sesiapa menemui jalan buntu
Penyelesaian adalah untuk menghalang kedua-dua utas daripada meraihnya kunci kedua pada masa yang sama. Biarkan A berhenti seketika Ya
Tetapi jika anda melaraskan masa ke tahap nanosaat dan mencuba beberapa kali, kebuntuan akan berlaku
Ini tidak disyorkan untuk mengelakkan kebuntuan konkurensi adalah tinggi.
阿神2017-04-18 10:56:48
Kedua-dua pihak berjuang untuk kunci yang sama, tidak akan ada jalan buntu
PHPz2017-04-18 10:56:48
Saya tiba-tiba tahu mengapa dan terlalu malas untuk memadamkan siaran itu. Saya akan catatkan pendapat saya. Jika saya salah, sila betulkan saya
Apabila tiada tidur, utas a bermula, selesaikan kaedah cubaLain, lepaskan kunci dan jalankan kaedah lain mendapatkan kunci dan melaksanakan kaedah tryOther,
Pada masa ini, sumber yang diperlukan oleh a dalam kaedah lain dikunci oleh benang b Selepas melaksanakan tryOther, b perlu mendapatkan sumber a, mengakibatkan kebuntuan.
Selepas menambah tidur. Apabila a melaksanakan kaedah tryOther untuk melepaskan kunci, benang b tidak dilaksanakan pada masa ini dan kunci lain berjaya diperoleh pada masa ini. Benang b dilaksanakan selepas 2s,
tiada persekitaran kebuntuan.