1. 程式人生 > >Java基礎之多執行緒二

Java基礎之多執行緒二

        /* 這是flag=1這個執行緒 */
        if (flag == 1) {
            synchronized (o1) {
                /* 使用synchronized關鍵字把物件01鎖定了 */
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (o2) {
                    /*
                     * 前面已經鎖住了物件o1,只要再能鎖住o2,那麼就能執行打印出1的操作了
                     * 可是這裡無法鎖定物件o2,因為在另外一個flag=0這個執行緒裡面已經把物件o1給鎖住了
                     * 儘管鎖住o2這個物件的執行緒會每隔500毫秒睡眠一次,可是在睡眠的時候仍然是鎖住o2不放的
                     */
                    System.out.println("1");
                }
            }
        }
        /*
         * 這裡的兩個if語句都將無法執行,因為已經造成了執行緒死鎖的問題
         * flag=1這個執行緒在等待flag=0這個執行緒把物件o2的鎖解開,
         * 而flag=0這個執行緒也在等待flag=1這個執行緒把物件o1的鎖解開
         * 然而這兩個執行緒都不願意解開鎖住的物件,所以就造成了執行緒死鎖的問題
         */