java面試線程相關(guān)

筆試題目一:請(qǐng)編寫一個(gè)多線程程序,實(shí)現(xiàn)兩個(gè)線程其中一個(gè)線程完成對(duì)某個(gè)對(duì)象的int成員變量的增加操作即每次加1,另一個(gè)線程完成對(duì)該對(duì)象的成員變量的減操作,即每次減1,同時(shí)要保證該變量的值不會(huì)小于0猿诸,不會(huì)大于1,該變量的初始值為0

答案狡忙,具體代碼如下:

package com.test;
//被操縱的對(duì)象
public class Sample2 {
    
    private int v;
    
    public synchronized void increase() {
        if (v != 0) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        v++;
        System.out.println(v);
        notify();
    }

    public synchronized void decrease() {
        if (v != 1) {
            try {
                wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        v--;
        System.out.println(v);
        notify();
    }
}

package com.test;
//減線程操縱Sample2對(duì)象的decrease方法
public class IncreaseThread extends Thread {
    
    Sample2 sample;
    
    public IncreaseThread(Sample2 sample) {
        this.sample = sample;
    }
    
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            try {
                Thread.sleep((long) (Math.random() * 1000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            sample.increase();
        }
    }

}
package com.test;
//增加線程操縱Sample2對(duì)象的increase方法
public class DecreaseThread extends Thread {
    
    Sample2 sample;
    
    public DecreaseThread(Sample2 sample) {
        this.sample = sample;
    }
    
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            try {
                Thread.sleep((long) (Math.random() * 1000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            sample.decrease();
        }
    }

}
package com.test;
//程序的入口
public class Main {

    public static void main(String[] args) {
        Sample2 sample = new Sample2();
        Thread increaseThread = new IncreaseThread(sample);
        Thread decreaseThread = new DecreaseThread(sample);
        increaseThread.start();
        decreaseThread.start();
        
    }
}

解題思路:首先這是一題關(guān)于線程之間通信的題目,典型的生產(chǎn)者與消費(fèi)者問(wèn)題,涉及到線程通信就需要用到wait方法以及notify方法或者notifyAll方法

筆試題目二:關(guān)于wait梳虽、notify、notifyAll以及sleep方法的關(guān)系(重點(diǎn))

  • 如果一個(gè)線程調(diào)用了某個(gè)對(duì)象的wait方法灾茁,那么該線程首先必須擁有該對(duì)象的鎖(換句話說(shuō),一個(gè)線程如果調(diào)用了某個(gè)對(duì)象的wait方法,那么該wait方法必須要在synchronized中)
  • 如果一個(gè)線程調(diào)用了某個(gè)對(duì)象的wait方法,那么該線程完全釋放該對(duì)象的鎖
  • 在java對(duì)象中有兩種池(鎖池窜觉、等待池)
  • 如果一個(gè)線程用了某個(gè)對(duì)象的wait方法,那么該線程進(jìn)入該對(duì)象的等待池中(釋放鎖)是复,如果未來(lái)的某一時(shí)刻,另外一個(gè)線程調(diào)用了相同對(duì)象的notify后者notifyAll方法竖螃,那么在該等待池中的等待的線程就會(huì)起來(lái)進(jìn)入該對(duì)象的鎖池中等待獲得該對(duì)象的鎖,如果獲得鎖成功后淑廊,那么該線程將繼續(xù)沿著wait方法之后的路徑去執(zhí)行。(也就是說(shuō)從等待池中被喚醒的線程并不會(huì)馬上獲得對(duì)象的鎖特咆,而是要先進(jìn)入到鎖池中,與其他鎖池中的線程一并去爭(zhēng)搶對(duì)象的鎖)

筆試題目三:wait(long timeout)的特點(diǎn)是什么?

答案:1. 等待timeout時(shí)間后自己起來(lái) 2. 在等待時(shí)間內(nèi)被通知?jiǎng)t起來(lái)

筆試題目四: Thread.sleep與wait區(qū)別是什么?

答案:如果一個(gè)線程調(diào)用了sleep方法睡眠,那么在睡眠的同時(shí)它不會(huì)失去對(duì)象的鎖的擁有權(quán),而wait方法線程會(huì)釋放掉對(duì)象的鎖并及進(jìn)入到對(duì)象的等待池中季惩。

學(xué)習(xí)線程的時(shí)候遇到的困惑一:一個(gè)線程循環(huán)調(diào)用了某個(gè)對(duì)象的同步方法那么循環(huán)一次就會(huì)釋放鎖一次?還是說(shuō)從循環(huán)開始到循環(huán)結(jié)束之前一直占據(jù)鎖直到循環(huán)結(jié)束才釋放腻格?

經(jīng)過(guò)代碼測(cè)試:循環(huán)一次就會(huì)釋放一次鎖画拾,重新調(diào)用對(duì)象的同步方法的時(shí)候會(huì)去判斷是否該對(duì)象加了鎖。即重新調(diào)用對(duì)象同步方法的時(shí)候會(huì)與其他線程進(jìn)行搶鎖

學(xué)習(xí)線程的時(shí)候遇到的困惑二:一個(gè)線程循環(huán)調(diào)用了某個(gè)對(duì)象的同步方法菜职,假設(shè)循環(huán)第一次的時(shí)候就執(zhí)行到了wait方法,我們都知道wait方法會(huì)讓線程釋放掉對(duì)象的鎖青抛,并進(jìn)入到對(duì)象的等待池中,那么第二次循環(huán)會(huì)開始嗎酬核?

答:第二次循環(huán)暫時(shí)不會(huì)開始蜜另,只有當(dāng)次的循環(huán)結(jié)束后才會(huì)開始,也就是說(shuō)循環(huán)執(zhí)行到wait方法后該線程被掛起了(線程阻塞了)嫡意,暫時(shí)不能繼續(xù)往下執(zhí)行了举瑰,直到其它線程把它喚醒,它才有機(jī)會(huì)執(zhí)行完當(dāng)次循環(huán)所調(diào)用的同步方法蔬螟,只有完整地執(zhí)行完第一次循環(huán)所調(diào)用的同步方法后才能進(jìn)行第二次循環(huán)此迅。

關(guān)于線程的知識(shí)點(diǎn)補(bǔ)充:

  • 在某個(gè)對(duì)象的所有synchronized方法中,在某一時(shí)刻只能有一個(gè)線程正在訪問(wèn)其中的一個(gè)synchronized方法旧巾,其他線程都在鎖池中等待
  • 如果一個(gè)方法是synchronized方法耸序,那么該synchronized關(guān)鍵字表示給當(dāng)前對(duì)象上鎖(即this)
  • 如果一個(gè)synchronized方法是靜態(tài)的(static的)那么該synchronized關(guān)鍵字表示給當(dāng)前對(duì)象所對(duì)應(yīng)的class對(duì)象上鎖(每個(gè)類,不管生成多少個(gè)對(duì)象鲁猩,其對(duì)立的class對(duì)象只有一個(gè))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坎怪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子绳匀,更是在濱河造成了極大的恐慌芋忿,老刑警劉巖炸客,帶你破解...
    沈念sama閱讀 212,222評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疾棵,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡痹仙,警方通過(guò)查閱死者的電腦和手機(jī)是尔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)开仰,“玉大人拟枚,你說(shuō)我怎么就攤上這事薪铜。” “怎么了恩溅?”我有些...
    開封第一講書人閱讀 157,720評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵隔箍,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我脚乡,道長(zhǎng)蜒滩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,568評(píng)論 1 284
  • 正文 為了忘掉前任奶稠,我火速辦了婚禮俯艰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锌订。我一直安慰自己竹握,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評(píng)論 6 386
  • 文/花漫 我一把揭開白布辆飘。 她就那樣靜靜地躺著啦辐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蜈项。 梳的紋絲不亂的頭發(fā)上昧甘,一...
    開封第一講書人閱讀 49,879評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音战得,去河邊找鬼充边。 笑死,一個(gè)胖子當(dāng)著我的面吹牛常侦,可吹牛的內(nèi)容都是我干的浇冰。 我是一名探鬼主播,決...
    沈念sama閱讀 39,028評(píng)論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼聋亡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼肘习!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起坡倔,我...
    開封第一講書人閱讀 37,773評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤漂佩,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后罪塔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體投蝉,經(jīng)...
    沈念sama閱讀 44,220評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評(píng)論 2 327
  • 正文 我和宋清朗相戀三年征堪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瘩缆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,697評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡佃蚜,死狀恐怖庸娱,靈堂內(nèi)的尸體忽然破棺而出着绊,到底是詐尸還是另有隱情,我是刑警寧澤熟尉,帶...
    沈念sama閱讀 34,360評(píng)論 4 332
  • 正文 年R本政府宣布归露,位于F島的核電站,受9級(jí)特大地震影響斤儿,放射性物質(zhì)發(fā)生泄漏靶擦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評(píng)論 3 315
  • 文/蒙蒙 一雇毫、第九天 我趴在偏房一處隱蔽的房頂上張望玄捕。 院中可真熱鬧,春花似錦棚放、人聲如沸枚粘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)馍迄。三九已至,卻和暖如春局骤,著一層夾襖步出監(jiān)牢的瞬間攀圈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工峦甩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赘来,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,433評(píng)論 2 360
  • 正文 我出身青樓凯傲,卻偏偏與公主長(zhǎng)得像犬辰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冰单,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 本文出自 Eddy Wiki 幌缝,轉(zhuǎn)載請(qǐng)注明出處:http://eddy.wiki/interview-java.h...
    eddy_wiki閱讀 2,077評(píng)論 0 14
  • 該文章轉(zhuǎn)自:http://blog.csdn.net/evankaka/article/details/44153...
    加來(lái)依藍(lán)閱讀 7,337評(píng)論 3 87
  • 本文主要講了java中多線程的使用方法、線程同步诫欠、線程數(shù)據(jù)傳遞涵卵、線程狀態(tài)及相應(yīng)的一些線程函數(shù)用法、概述等荒叼。 首先講...
    李欣陽(yáng)閱讀 2,444評(píng)論 1 15
  • Java多線程學(xué)習(xí) [-] 一擴(kuò)展javalangThread類 二實(shí)現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 2,952評(píng)論 1 18
  • 一轿偎、庭院深深 天上飄著絲絲細(xì)雨,綿密輕柔甩挫,悄無(wú)聲息地潤(rùn)濕了院子里的青磚地贴硫。因?yàn)橄掠甑木壒剩m然還沒(méi)到晚上伊者,天色卻顯...
    傾曼閱讀 425評(píng)論 0 2