最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2016年11月01日 11:04:34   作者:Central-Perk  
這篇文章收集了 Java 線程方面一些典型的問題,這些問題經(jīng)常被高級工程師所問到。這篇文章收集了 Java 線程方面一些典型的問題,這些問題經(jīng)常被高級工程師所問到。

很多核心 Java 面試題來源于多線程(Multi-Threading)和集合框架(Collections Framework),理解核心線程概念時,嫻熟的實際經(jīng)驗是必需的。這篇文章收集了 Java 線程方面一些典型的問題,這些問題經(jīng)常被高級工程師所問到。

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

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

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

一 Java 線程可以實現(xiàn) Runnable 接口或者繼承 Thread 類來實現(xiàn),當你打算多重繼承時,優(yōu)先選擇實現(xiàn) Runnable。

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

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

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

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

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

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

下面是線程局部變量(ThreadLocal variables)的關鍵點:

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

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

當多個線程訪問 ThreadLocal 實例時,每個線程維護 ThreadLocal 提供的獨立的變量副本。

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

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

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

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

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

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

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

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

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

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

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

下面有一個示例說明:Common 類有兩個方法 synchronizedMethod1()和 method1(),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 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

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

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

不能,因為一個對象已經(jīng)同步了實例方法,線程獲取了對象的對象鎖。所以只有執(zhí)行完該方法釋放對象鎖后才能執(zhí)行其它同步方法??聪旅娲a示例非常清晰: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ā)生在當兩個線程嘗試獲取其它資源的鎖,而每個線程又陷入無限等待其它資源鎖的釋放,除非一個用戶進程被終止。就 JavaAPI 而言,線程死鎖可能發(fā)生在一下情況。

  • 當兩個線程相互調(diào)用 Thread.join ()
  • 當兩個線程使用嵌套的同步塊,一個線程占用了另外一個線程必需的鎖,互相等待時被阻塞就有可能出現(xiàn)死鎖。

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

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

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

  • 當所有線程在程序中執(zhí)行 Object.wait (0),參數(shù)為 0 的 wait 方法。程序將發(fā)生活鎖直到在相應的對象上有線程調(diào)用 Object.notify ()或者 Object.notifyAll ()。
  • 當所有線程卡在無限循環(huán)中。

這里的問題并不詳盡,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關文章

  • java如何獲取byte的高四位和低四位

    java如何獲取byte的高四位和低四位

    這篇文章主要介紹了java如何獲取byte的高四位和低四位,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • springBoot使用openfeign來遠程調(diào)用的實現(xiàn)

    springBoot使用openfeign來遠程調(diào)用的實現(xiàn)

    這篇文章主要介紹了springBoot使用openfeign來遠程調(diào)用的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java線程池流程編排運用實戰(zhàn)源碼

    Java線程池流程編排運用實戰(zhàn)源碼

    這篇文章主要介紹了Java線程池流程編排運用實戰(zhàn)源碼,就在流程引擎的基礎上運用?ThreadPoolExecutor,使用線程池實現(xiàn)?SpringBean?的異步執(zhí)行
    2022-03-03
  • MyBatis?Mapper.XML?標簽使用小結

    MyBatis?Mapper.XML?標簽使用小結

    在MyBatis中,通過resultMap可以解決字段名和屬性名不一致的問題,對于復雜的查詢,引用實體或使用<sql>標簽可以定義復用的SQL片段,提高代碼的可讀性和編碼效率,使用這些高級映射和動態(tài)SQL技巧,可以有效地處理復雜的數(shù)據(jù)庫交互場景
    2024-10-10
  • 詳解springboot+mybatis-plue實現(xiàn)內(nèi)置的CRUD使用詳情

    詳解springboot+mybatis-plue實現(xiàn)內(nèi)置的CRUD使用詳情

    這篇文章主要介紹了詳解springboot+mybatis-plue實現(xiàn)內(nèi)置的CRUD使用詳情,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • java金錢處理方法實例詳解

    java金錢處理方法實例詳解

    這篇文章主要介紹了java金錢處理方法實例詳解的相關資料,這里提供實現(xiàn)方法分轉化成元的實現(xiàn)方法,需要的朋友可以參考下
    2017-08-08
  • 詳解Mybatis極其(最)簡(好)單(用)的一個分頁插件

    詳解Mybatis極其(最)簡(好)單(用)的一個分頁插件

    這篇文章主要介紹了詳解Mybatis極其(最)簡(好)單(用)的一個分頁插件,非常具有實用價值,需要的朋友可以參考下。
    2016-12-12
  • Java中類的定義和初始化示例詳解

    Java中類的定義和初始化示例詳解

    這篇文章主要給大家介紹了關于Java中類的定義和初始化的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • JAVA匿名內(nèi)部類(Anonymous Classes)的具體使用

    JAVA匿名內(nèi)部類(Anonymous Classes)的具體使用

    本文主要介紹了JAVA匿名內(nèi)部類,匿名內(nèi)部類在我們JAVA程序員的日常工作中經(jīng)常要用到,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Spring?MVC請求轉發(fā)與請求重定向的示例詳解

    Spring?MVC請求轉發(fā)與請求重定向的示例詳解

    轉發(fā)指服務器接收請求后,從一個資源跳轉到另一個資源中,請求轉發(fā)是一次請求,不會改變?yōu)g覽器的請求地址,這篇文章主要介紹了Spring?MVC請求轉發(fā)與請求重定向的相關知識,需要的朋友可以參考下
    2023-09-09

最新評論

滨海县| 玉环县| 秀山| 达孜县| 海晏县| 巴塘县| 增城市| 临武县| 茂名市| 昌吉市| 互助| 开原市| 封开县| 鱼台县| 黎川县| 钟山县| 肃宁县| 昂仁县| 霍山县| 屏边| 独山县| 钟祥市| 九江县| 池州市| 灵武市| 治县。| 霍林郭勒市| 赤峰市| 丁青县| 菏泽市| 白银市| 乐东| 镇江市| 长武县| 集安市| 揭阳市| 衡山县| 丽江市| 鄂伦春自治旗| 阿拉尔市| 临潭县|