国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Java > 正文

詳解Java的線程的優(yōu)先級(jí)以及死鎖

2019-11-26 14:57:21
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

Java線程優(yōu)先級(jí)
需要避免的與多任務(wù)處理有關(guān)的特殊錯(cuò)誤類(lèi)型是死鎖(deadlock)。死鎖發(fā)生在當(dāng)兩個(gè)線程對(duì)一對(duì)同步對(duì)象有循環(huán)依賴關(guān)系時(shí)。例如,假定一個(gè)線程進(jìn)入了對(duì)象X的管程而另一個(gè)線程進(jìn)入了對(duì)象Y的管程。如果X的線程試圖調(diào)用Y的同步方法,它將像預(yù)料的一樣被鎖定。而Y的線程同樣希望調(diào)用X的一些同步方法,線程永遠(yuǎn)等待,因?yàn)闉榈竭_(dá)X,必須釋放自己的Y的鎖定以使第一個(gè)線程可以完成。死鎖是很難調(diào)試的錯(cuò)誤,因?yàn)椋?br />通常,它極少發(fā)生,只有到兩線程的時(shí)間段剛好符合時(shí)才能發(fā)生。
它可能包含多于兩個(gè)的線程和同步對(duì)象(也就是說(shuō),死鎖在比剛講述的例子有更多復(fù)雜的事件序列的時(shí)候可以發(fā)生)。

為充分理解死鎖,觀察它的行為是很有用的。下面的例子生成了兩個(gè)類(lèi),A和B,分別有foo( )和bar( )方法。這兩種方法在調(diào)用其他類(lèi)的方法前有一個(gè)短暫的停頓。主類(lèi),名為Deadlock,創(chuàng)建了A和B的實(shí)例,然后啟動(dòng)第二個(gè)線程去設(shè)置死鎖環(huán)境。foo( )和bar( )方法使用sleep( )強(qiáng)迫死鎖現(xiàn)象發(fā)生。

// An example of deadlock.class A {  synchronized void foo(B b) {    String name = Thread.currentThread().getName();    System.out.println(name + " entered A.foo");    try {      Thread.sleep(1000);    } catch(Exception e) {      System.out.println("A Interrupted");    }    System.out.println(name + " trying to call B.last()");    b.last();  }  synchronized void last() {    System.out.println("Inside A.last");  }}class B {  synchronized void bar(A a) {    String name = Thread.currentThread().getName();    System.out.println(name + " entered B.bar");    try {      Thread.sleep(1000);    } catch(Exception e) {      System.out.println("B Interrupted");    }    System.out.println(name + " trying to call A.last()");    a.last();  }  synchronized void last() {    System.out.println("Inside A.last");  }}class Deadlock implements Runnable {  A a = new A();  B b = new B();  Deadlock() {    Thread.currentThread().setName("MainThread");    Thread t = new Thread(this, "RacingThread");    t.start();    a.foo(b); // get lock on a in this thread.    System.out.println("Back in main thread");  }  public void run() {    b.bar(a); // get lock on b in other thread.    System.out.println("Back in other thread");  }  public static void main(String args[]) {    new Deadlock();  }}

運(yùn)行程序后,輸出如下:

MainThread entered A.fooRacingThread entered B.barMainThread trying to call B.last()RacingThread trying to call A.last()

因?yàn)槌绦蛩梨i,你需要按CTRL-C來(lái)結(jié)束程序。在PC機(jī)上按CTRL-BREAK(或在Solaris下按CTRL-/)你可以看到全線程和管程緩沖堆。你會(huì)看到RacingThread在等待管程a時(shí)占用管程b,同時(shí),MainThread占用a等待b。該程序永遠(yuǎn)都不會(huì)結(jié)束。像該例闡明的,你的多線程程序經(jīng)常被鎖定,死鎖是你首先應(yīng)檢查的問(wèn)題。

Java線程死鎖
需要避免的與多任務(wù)處理有關(guān)的特殊錯(cuò)誤類(lèi)型是死鎖(deadlock)。死鎖發(fā)生在當(dāng)兩個(gè)線程對(duì)一對(duì)同步對(duì)象有循環(huán)依賴關(guān)系時(shí)。例如,假定一個(gè)線程進(jìn)入了對(duì)象X的管程而另一個(gè)線程進(jìn)入了對(duì)象Y的管程。如果X的線程試圖調(diào)用Y的同步方法,它將像預(yù)料的一樣被鎖定。而Y的線程同樣希望調(diào)用X的一些同步方法,線程永遠(yuǎn)等待,因?yàn)闉榈竭_(dá)X,必須釋放自己的Y的鎖定以使第一個(gè)線程可以完成。死鎖是很難調(diào)試的錯(cuò)誤,因?yàn)椋?br />通常,它極少發(fā)生,只有到兩線程的時(shí)間段剛好符合時(shí)才能發(fā)生。
它可能包含多于兩個(gè)的線程和同步對(duì)象(也就是說(shuō),死鎖在比剛講述的例子有更多復(fù)雜的事件序列的時(shí)候可以發(fā)生)。

為充分理解死鎖,觀察它的行為是很有用的。下面的例子生成了兩個(gè)類(lèi),A和B,分別有foo( )和bar( )方法。這兩種方法在調(diào)用其他類(lèi)的方法前有一個(gè)短暫的停頓。主類(lèi),名為Deadlock,創(chuàng)建了A和B的實(shí)例,然后啟動(dòng)第二個(gè)線程去設(shè)置死鎖環(huán)境。foo( )和bar( )方法使用sleep( )強(qiáng)迫死鎖現(xiàn)象發(fā)生。

// An example of deadlock.class A {  synchronized void foo(B b) {    String name = Thread.currentThread().getName();    System.out.println(name + " entered A.foo");    try {      Thread.sleep(1000);    } catch(Exception e) {      System.out.println("A Interrupted");    }    System.out.println(name + " trying to call B.last()");    b.last();  }  synchronized void last() {    System.out.println("Inside A.last");  }}class B {  synchronized void bar(A a) {    String name = Thread.currentThread().getName();    System.out.println(name + " entered B.bar");    try {      Thread.sleep(1000);    } catch(Exception e) {      System.out.println("B Interrupted");    }    System.out.println(name + " trying to call A.last()");    a.last();  }  synchronized void last() {    System.out.println("Inside A.last");  }}class Deadlock implements Runnable {  A a = new A();  B b = new B();  Deadlock() {    Thread.currentThread().setName("MainThread");    Thread t = new Thread(this, "RacingThread");    t.start();    a.foo(b); // get lock on a in this thread.    System.out.println("Back in main thread");  }  public void run() {    b.bar(a); // get lock on b in other thread.    System.out.println("Back in other thread");  }  public static void main(String args[]) {    new Deadlock();  }}

運(yùn)行程序后,輸出如下:

MainThread entered A.fooRacingThread entered B.barMainThread trying to call B.last()RacingThread trying to call A.last()

因?yàn)槌绦蛩梨i,你需要按CTRL-C來(lái)結(jié)束程序。在PC機(jī)上按CTRL-BREAK(或在Solaris下按CTRL-/)你可以看到全線程和管程緩沖堆。你會(huì)看到RacingThread在等待管程a時(shí)占用管程b,同時(shí),MainThread占用a等待b。該程序永遠(yuǎn)都不會(huì)結(jié)束。像該例闡明的,你的多線程程序經(jīng)常被鎖定,死鎖是你首先應(yīng)檢查的問(wèn)題。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 九龙坡区| 安泽县| 缙云县| 尉氏县| 镇康县| 丹东市| 盐边县| 肃北| 平乐县| 清丰县| 防城港市| 康马县| 昂仁县| 平阳县| 青冈县| 乐业县| 惠安县| 随州市| 吉安市| 交口县| 资中县| 嘉定区| 元阳县| 涿鹿县| 黄冈市| 台南县| 淳安县| 延津县| 奉新县| 保山市| 英超| 措勤县| 弥渡县| 陇川县| 休宁县| 策勒县| 牡丹江市| 荔波县| 玉屏| 五河县| 寿宁县|