コンセプトのデッドロック
「デッドロック」とは:
複数のスレッドそれぞれがいくつかの共有リソースを占有し、他のスレッドが互いのリソースを解放するのを待っている2つの以上のスレッドで、その結果、互いのリソースが占有されるのを待つ、状況は実行を停止しました。
したがって、「デッドロック」の問題についての同期ブロックを持っている必要があります「ロック2以上のオブジェクトは、」発生する可能性があります。次の場合、「メークスレッド」シンクブロックを実行するために、「ミラーオブジェクト」、「口紅オブジェクトを」持っている必要があります。お互いが化粧するためには、お互いにリソースを解放するためので、実際の走行時間、「小鴨化粧スレッド」、「ビッグ地獄メイクスレッドを」「ミラーオブジェクトを」持っている持っている「口紅のオブジェクトは、」待っています。このように、2つのスレッドが実行し続けることができない「デッドロック状態」を形成するためにお互いを待ちます。
デモデッドロック:
class Lipstick {//口红类
}
class Mirror {//镜子类
}
class Makeup extends Thread {//化妆类继承了Thread类
int flag;
String girl;
static Lipstick lipstick = new Lipstick();
static Mirror mirror = new Mirror();
@Override
public void run() {
// TODO Auto-generated method stub
doMakeup();
}
void doMakeup() {
if (flag == 0) {
synchronized (lipstick) {//需要得到口红的“锁”;
System.out.println(girl + "拿着口红!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (mirror) {//需要得到镜子的“锁”;
System.out.println(girl + "拿着镜子!");
}
}
} else {
synchronized (mirror) {
System.out.println(girl + "拿着镜子!");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lipstick) {
System.out.println(girl + "拿着口红!");
}
}
}
}
}
public class TestDeadLock {
public static void main(String[] args) {
Makeup m1 = new Makeup();//大丫的化妆线程;
m1.girl = "大丫";
m1.flag = 0;
Makeup m2 = new Makeup();//小丫的化妆线程;
m2.girl = "小丫";
m2.flag = 1;
m1.start();
m2.start();
}
}
示すような結果(2つのスレッドが互いのリソースを待っている静止しています):
デッドロックソリューション
デッドロックは、この問題を解決するために、「シンクブロックは、複数のオブジェクトのロックの原因を保持する必要がある」、アイデアは非常に単純であるためであった:同じブロック、同時にロックで2つのオブジェクトを保持していません。デッドロックの場合、上述のように、示された例に変更。
問題のデッドロック解決策:
class Lipstick {//口红类
}
class Mirror {//镜子类
}
class Makeup extends Thread {//化妆类继承了Thread类
int flag;
String girl;
static Lipstick lipstick = new Lipstick();
static Mirror mirror = new Mirror();
@Override
public void run() {
// TODO Auto-generated method stub
doMakeup();
}
void doMakeup() {
if (flag == 0) {
synchronized (lipstick) {
System.out.println(girl + "拿着口红!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized (mirror) {
System.out.println(girl + "拿着镜子!");
}
} else {
synchronized (mirror) {
System.out.println(girl + "拿着镜子!");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized (lipstick) {
System.out.println(girl + "拿着口红!");
}
}
}
}
public class TestDeadLock {
public static void main(String[] args) {
Makeup m1 = new Makeup();// 大丫的化妆线程;
m1.girl = "大丫";
m1.flag = 0;
Makeup m2 = new Makeup();// 小丫的化妆线程;
m2.girl = "小丫";
m2.flag = 1;
m1.start();
m2.start();
}
}
示すような結果(2つのスレッドが実行中のプログラムを終了するために必要なリソースを取得することができます):