中文一二三区_九九在线中文字幕无码_国产一二区av_38激情网_欧美一区=区三区_亚洲高清免费观看在线视频

首頁 > 個人簡歷 > 簡歷資料 > 面試試題 > Java程序員面試中的多線程問題

Java程序員面試中的多線程問題

發(fā)布時間:2019-05-07

Java程序員面試中的多線程問題

  0、java中多線程同步是什么?

  在多線程程序下,同步能控制對共享資源的訪問。如果沒有同步,當(dāng)一個java線程在修改一個共享變量時,另外一個線程正在使用或者更新同一個變量,這樣容易導(dǎo)致程序出現(xiàn)錯誤的結(jié)果。

  1、解釋實(shí)現(xiàn)多線程的幾種方法?

  一java線程可以實(shí)現(xiàn)runnable接口或者繼承thread類來實(shí)現(xiàn),當(dāng)你打算多重繼承時,優(yōu)先選擇實(shí)現(xiàn)runnable。

  2、thread.start()與thread.run()有什么區(qū)別?

  thread.start()方法(native)啟動線程,使之進(jìn)入就緒狀態(tài),當(dāng)cpu分配時間該線程時,由jvm調(diào)度執(zhí)行run()方法。

  3、為什么需要run()和start()方法,我們可以只用run()方法來完成任務(wù)嗎?

  我們需要run()&start()這兩個方法是因?yàn)閖vm創(chuàng)建一個單獨(dú)的線程不同于普通方法的調(diào)用,所以這項(xiàng)工作由線程的start方法來完成,start由本地方法實(shí)現(xiàn),需要顯示地被調(diào)用,使用這倆個方法的另外一個好處是任何一個對象都可以作為線程運(yùn)行,只要實(shí)現(xiàn)了runnable接口,這就避免因繼承了thread類而造成的java的多繼承問題。

  4、什么是threadlocal類,怎么使用它?

  threadlocal是一個線程級別的局部變量,并非“本地線程”。threadlocal為每個使用該變量的線程提供了一個獨(dú)立的變量副本,每個線程修改副本時不影響其它線程對象的副本(譯者注)。

  下面是線程局部變量(threadlocal variables)的關(guān)鍵點(diǎn):

  一個線程局部變量(threadlocal variables)為每個線程方便地提供了一個單獨(dú)的變量。

  threadlocal實(shí)例通常作為靜態(tài)的私有的(private static)字段出現(xiàn)在一個類中,這個類用來關(guān)聯(lián)一個線程。

  當(dāng)多個線程訪問threadlocal實(shí)例時,每個線程維護(hù)threadlocal提供的獨(dú)立的變量副本。

  常用的使用可在dao模式中見到,當(dāng)dao類作為一個單例類時,數(shù)據(jù)庫鏈接(connection)被每一個線程獨(dú)立的維護(hù),互不影響。(基于線程的單例)

  5、什么時候拋出invalidmonitorstateexception異常,為什么?

  調(diào)用wait()/notify()/notifyall()中的任何一個方法時,如果當(dāng)前線程沒有獲得該對象的鎖,那么就會拋出illegalmonitorstateexception的異常(也就是說程序在沒有執(zhí)行對象的任何同步塊或者同步方法時,仍然嘗試調(diào)用wait()/notify()/notifyall()時)。由于該異常是runtimeexcpetion的子類,所以該異常不一定要捕獲(盡管你可以捕獲只要你愿意).作為runtimeexception,此類異常不會在wait(),notify(),notifyall()的方法簽名提及。

  6、sleep()、suspend()和wait()之間有什么區(qū)別?

  thread.sleep()使當(dāng)前線程在指定的時間處于“非運(yùn)行”(not runnable)狀態(tài)。線程一直持有對象的監(jiān)視器。比如一個線程當(dāng)前在一個同步塊或同步方法中,其它線程不能進(jìn)入該塊或方法中。如果另一線程調(diào)用了 interrupt()方法,它將喚醒那個“睡眠的”線程。

  注意:sleep()是一個靜態(tài)方法。這意味著只對當(dāng)前線程有效,一個常見的錯誤是調(diào)用t.sleep(),(這里的t是一個不同于當(dāng)前線程的線程)。即便是執(zhí)行t.sleep(),也是當(dāng)前線程進(jìn)入睡眠,而不是t線程。t.suspend()是過時的方法,使用suspend()導(dǎo)致線程進(jìn)入停滯狀態(tài),該線程會一直持有對象的監(jiān)視器,suspend()容易引起死鎖問題。

  object.wait()使當(dāng)前線程出于“不可運(yùn)行”狀態(tài),和sleep()不同的是wait是object的方法而不是thread。調(diào)用 object.wait()時,線程先要獲取這個對象的對象鎖,當(dāng)前線程必須在鎖對象保持同步,把當(dāng)前線程添加到等待隊(duì)列中,隨后另一線程可以同步同一個對象鎖來調(diào)用object.notify(),這樣將喚醒原來等待中的線程,然后釋放該鎖。基本上wait()/notify()與sleep() /interrupt()類似,只是前者需要獲取對象鎖。

  7、在靜態(tài)方法上使用同步時會發(fā)生什么事?

  同步靜態(tài)方法時會獲取該類的“class”對象,所以當(dāng)一個線程進(jìn)入同步的靜態(tài)方法中時,線程監(jiān)視器獲取類本身的對象鎖,其它線程不能進(jìn)入這個類的任何靜態(tài)同步方法。它不像實(shí)例方法,因?yàn)槎鄠線程可以同時訪問不同實(shí)例同步實(shí)例方法。

  8、當(dāng)一個同步方法已經(jīng)執(zhí)行,線程能夠調(diào)用對象上的非同步實(shí)例方法嗎?

  可以,一個非同步方法總是可以被調(diào)用而不會有任何問題。實(shí)際上,java沒有為非同步方法做任何檢查,鎖對象僅僅在同步方法或者同步代碼塊中檢查。如果一個方法沒有聲明為同步,即使你在使用共享數(shù)據(jù)java照樣會調(diào)用,而不會做檢查是否安全,所以在這種情況下要特別小心。一個方法是否聲明為同步取決于臨界區(qū)訪問(critial section access),如果方法不訪問臨界區(qū)(共享資源或者數(shù)據(jù)結(jié)構(gòu))就沒必要聲明為同步的。

  下面有一個示例說明:common類有兩個方法synchronizedmethod1()和method1(),mythread類在獨(dú)立的線程中調(diào)用這兩個方法。

  public class common {

  public synchronized void synchronizedmethod1() {

  system.out.println("synchronizedmethod1 called");

  try {

  thread.sleep(1000);

  } catch (interruptedexception e) {

  e.printstacktrace();

  }

  system.out.println("synchronizedmethod1 done");

  }

  public void method1() {

  system.out.println("method 1 called");

  try {

  thread.sleep(1000);

  } catch (interruptedexception e) {

  e.printstacktrace();

  }

  system.out.println("method 1 done");

  }

  }

  public class mythread extends thread {

  private int id = 0;

  private common common;

  public mythread(string name, int no, common object) {

  super(name);

  common = object;

  id = no;

  }

  public void run() {

  system.out.println("running thread" + this.getname());

  try {

  if (id == 0) {

  common.synchronizedmethod1();

  } else {

  common.method1();

  }

  } catch (exception e) {

  e.printstacktrace();

  }

  }

  public static void main(string[] args) {

  common c = new common();

  mythread t1 = new mythread("mythread-1", 0, c);

  mythread t2 = new mythread("mythread-2", 1, c);

  t1.start();

  t2.start();

  }

  }

  這里是程序的輸出:

  running threadmythread-1

  synchronizedmethod1 called

  running threadmythread-2

  method 1 called

  synchronizedmethod1 done

  method 1 done

  結(jié)果表明即使synchronizedmethod1()方法執(zhí)行了,method1()也會被調(diào)用。

  9、 在一個對象上兩個線程可以調(diào)用兩個不同的同步實(shí)例方法嗎?

  不能,因?yàn)橐粋對象已經(jīng)同步了實(shí)例方法,線程獲取了對象的對象鎖。所以只有執(zhí)行完該方法釋放對象鎖后才能執(zhí)行其它同步方法。看下面代碼示例非常清晰:common 類 有synchronizedmethod1()和synchronizedmethod2()方法,mythread調(diào)用這兩個方法。

  public class common {

  public synchronized void synchronizedmethod1() {

  system.out.println("synchronizedmethod1 called");

  try {

  thread.sleep(1000);

  } catch (interruptedexception e) {

  e.printstacktrace();

  }

  system.out.println("synchronizedmethod1 done");

  }

  public synchronized void synchronizedmethod2() {

  system.out.println("synchronizedmethod2 called");

  try {

  thread.sleep(1000);

  } catch (interruptedexception e) {

  e.printstacktrace();

  }

  system.out.println("synchronizedmethod2 done");

  }

  }

  public class mythread extends thread {

  private int id = 0;

  private common common;

  public mythread(string name, int no, common object) {

  super(name);

  common = object;

  id = no;

  }

  public void run() {

  system.out.println("running thread" + this.getname());

  try {

  if (id == 0) {

  common.synchronizedmethod1();

  } else {

  common.synchronizedmethod2();

  }

  } catch (exception e) {

  e.printstacktrace();

  }

  }

  public static void main(string[] args) {

  common c = new common();

  mythread t1 = new mythread("mythread-1", 0, c);

  mythread t2 = new mythread("mythread-2", 1, c);

  t1.start();

  t2.start();

  }

  }

  10、 什么是死鎖

  死鎖就是兩個或兩個以上的線程被無限的阻塞,線程之間相互等待所需資源。這種情況可能發(fā)生在當(dāng)兩個線程嘗試獲取其它資源的鎖,而每個線程又陷入無限等待其它資源鎖的釋放,除非一個用戶進(jìn)程被終止。就javaapi而言,線程死鎖可能發(fā)生在一下情況。

  ●當(dāng)兩個線程相互調(diào)用thread.join()

  ●當(dāng)兩個線程使用嵌套的同步塊,一個線程占用了另外一個線程必需的鎖,互相等待時被阻塞就有可能出現(xiàn)死鎖。

  11、什么是線程餓死,什么是活鎖?

  線程餓死和活鎖雖然不想是死鎖一樣的常見問題,但是對于并發(fā)編程的設(shè)計(jì)者來說就像一次邂逅一樣。

  當(dāng)所有線程阻塞,或者由于需要的資源無效而不能處理,不存在非阻塞線程使資源可用。javaapi中線程活鎖可能發(fā)生在以下情形:

  ●當(dāng)所有線程在程序中執(zhí)行object.wait(0),參數(shù)為0的wait方法。程序?qū)l(fā)生活鎖直到在相應(yīng)的對象上有線程調(diào)用object.notify()或者object.notifyall()。

  ●當(dāng)所有線程卡在無限循環(huán)中。

主站蜘蛛池模板: 精品久久久久久无码中文野结衣 | 黄瓜视频入口永久免费观看 | 日韩人妻无码精品久久久不卡 | 国产成人久久精品麻豆二区照片 | 伊人青青视频 | 在线看免费视频 | 欧美中文字幕一区二区 | 亚洲国产精品二区 | 久久综合狠狠色综合伊人 | 亚洲avtv永久综合在线 | 国产在线观看免费av | 欧美一区二区三区视频 | 国产午夜免费视频 | 99热精品在线 | 成人午夜免费看 | 久久精品噜噜噜成人88aⅴ | 欧美αv日韩αv另类综合 | 亚洲三区av | 国产成人AV片无码免费 | 青草视频免费在线 | 久久综合激激的五月天 | 亚洲乱码中文字幕综合区 | 日本大片在线观看 | 欧美精品粉嫩高潮一区二区 | 免费人成A片在线观看免费 国产在线播放av | 少妇无码一区二区三区免费 | 久久久青青草原 | 在线视频三区日本精品 | 古装三级在线观看 | 特a级黄色片 | 久久日本理伦片aaaaaaa | 九九久久精品国产 | 中文字幕丰满乱子无码视频 | 久草资源免费 | 久久精品国产清高在天天线 | www国产亚洲精品 | a片久久久久久久久久久久 免费观看日韩精品 | 日本熟妇高清一区二区三区 | 跪趴式啪啪gif动态图27报 | 久久免费视频在线观看30 | 日本久久精品一区 |