激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - 詳解Java的線程的優(yōu)先級(jí)以及死鎖

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

2020-01-07 14:24goldensun JAVA教程

這篇文章主要介紹了詳解Java的線程的優(yōu)先級(jí)以及死鎖,線程是Java編程學(xué)習(xí)中的重要知識(shí),需要的朋友可以參考下

Java線程優(yōu)先級(jí)
需要避免的與多任務(wù)處理有關(guān)的特殊錯(cuò)誤類型是死鎖(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è)類,A和B,分別有foo( )和bar( )方法。這兩種方法在調(diào)用其他類的方法前有一個(gè)短暫的停頓。主類,名為Deadlock,創(chuàng)建了A和B的實(shí)例,然后啟動(dòng)第二個(gè)線程去設(shè)置死鎖環(huán)境。foo( )和bar( )方法使用sleep( )強(qiáng)迫死鎖現(xiàn)象發(fā)生。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// 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)行程序后,輸出如下:

?
1
2
3
4
MainThread entered A.foo
RacingThread entered B.bar
MainThread 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ò)誤類型是死鎖(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è)類,A和B,分別有foo( )和bar( )方法。這兩種方法在調(diào)用其他類的方法前有一個(gè)短暫的停頓。主類,名為Deadlock,創(chuàng)建了A和B的實(shí)例,然后啟動(dòng)第二個(gè)線程去設(shè)置死鎖環(huán)境。foo( )和bar( )方法使用sleep( )強(qiáng)迫死鎖現(xiàn)象發(fā)生。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// 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)行程序后,輸出如下:

?
1
2
3
4
MainThread entered A.foo
RacingThread entered B.bar
MainThread 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)題。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲乱搞 | 国产精品久久久免费观看 | 亚洲欧美国产高清va在线播放 | 成人免费一区二区 | 日本一区二区久久久 | 91精品久久久久久久久 | 特色一级黄色片 | 日韩毛片一区二区三区 | 91精品国产综合久久久动漫日韩 | 日韩黄色影视 | 欧美日韩高清一区二区三区 | 久久综合久久综合久久综合 | 999久久国精品免费观看网站 | 国内xxxx乱子另类 | 久久久久成人免费 | 成年免费大片黄在线观看岛国 | 精品在线一区二区三区 | 国色天香综合网 | 九九热在线精品视频 | 久久9久久 | av中文字幕免费在线观看 | 激情大乳女做爰办公室韩国 | 精品一区在线视频 | hdbbwsexvideo | 万圣街在线观看免费完整版 | 国产高清美女一级毛片 | 黄在线免费 | 欧美极品免费 | 午夜精品视频免费观看 | 性大片免费看 | 得得啪在线 | 日本在线播放一区二区 | 免费在线观看毛片 | 久久久久久久.comav | 亚洲成人在线视频网站 | 日韩视频在线观看免费视频 | 日韩精品久久久久久久电影99爱 | 亚洲欧美在线视频免费 | 美女污污视频在线观看 | 91香蕉国产亚洲一区二区三区 | 国产成人精品免费视频大全最热 |