欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報邀請碼778899分享:jvm Java面試八股文

柚子快報邀請碼778899分享:jvm Java面試八股文

http://yzkb.51969.com/

目錄

Java基礎

1、Hashmap底層原理

2、如何解決哈希沖突

2.1你知道HahsMap死循環(huán)問題嗎 ?

3、Concurrenthashmap 為什么是線程安全的?

TreeMap,HashMap,LinkedHashMap 的區(qū)別?

4、super和this的共同點的區(qū)別

5、final關(guān)鍵字

6、集合

6.1、map

6.2、set

6.3List

6.4、Queu

6.5、Stack

7、ArrayList,Vector, LinkedList 的存儲性能和特性?

8、內(nèi)存泄漏和溢出

9、int和Integer的區(qū)別

10、String、StringBuilder、StringBuffer區(qū)別

11、hashtable和hashmap的區(qū)別

12、方法重載的規(guī)則?

13、方法的重寫的規(guī)則

14、thow和thows的區(qū)別

15.、抽象(abstract)類和接口的區(qū)別?

16、Java的基本類型和字節(jié)大小

17、訪問修飾符的區(qū)別訪問級別?

18、HashSet 的底層實現(xiàn)是什么?

19、為什么重寫 equals 時必須重寫 hashCode 方法?

20、HashSet 和 TreeSet 有什么區(qū)別?

21、Java 中的四大引用分別是什么?

22、數(shù)組在內(nèi)存中如何分配

23、Java 中怎么創(chuàng)建一個不可變對象?

24、Java 中++操作符是線程安全的嗎?

25、==與equals()區(qū)別

26、final,finalize 和 finally 的不同之處?

27、Java 的多態(tài)是什么,表現(xiàn)在哪里?**

28、static類型有什么特點

29、Java 創(chuàng)建對象的幾種方式?

30、&和&&的區(qū)別?

31、在 java 源文件中可以有多個類嗎內(nèi)部類除外?

32.如何正確的退出多層嵌套循環(huán)?

33.內(nèi)部類有什么作用?

34、深拷貝和淺拷貝的區(qū)別

35、值傳遞和引用傳遞

36、成員變量和局部變量的區(qū)別有哪些?

37、靜態(tài)方法和實例方法有何不同?

38、多態(tài)的優(yōu)點?

39、Java 面向?qū)ο蟮奶卣饔心男┓矫妫?/p>

40、什么是反射

41、反射的作用

42、break 和 continue 的區(qū)別?

43、Collection 和 Collections 的區(qū)別?

44、Error 和 Exception 有什么區(qū)別?

45、Comparable 和 Comparator 接口的區(qū)別?

46、switch 能否作用在 byte,long,String 上?

47、什么是迭代器(Iterator)?

48、Iterator 和 ListIterator 的區(qū)別是什么?

49、Enumeration 接口和 Iterator 接口的區(qū)別有哪些?

50、字符串常量池到底存在于內(nèi)存空間的哪里?

51、Java 中的編譯期常量是什么,使用它又什么風險?

52、用哪兩種方式來實現(xiàn)集合的排序?

53、說出一些 JDK1.8 的新特性?

Java基礎

1、Hashmap底層原理

它的底層是數(shù)組、鏈表、因此在JDK1.8之后,加上了紅黑樹

數(shù)組初始默認長度是16,加載因子為0.75,當超過16*0.75時會擴容到原來的兩倍;

1、通過hash算法計算出當前的hashcode值,跟據(jù)數(shù)組長度取余,跟據(jù)獲得的余數(shù)存儲到相應的數(shù)組中。

2、通過下標存儲鍵值時,如果當前數(shù)組下標沒有其他鍵直接存入,如果數(shù)組中存有其他鍵值時則會發(fā)生hash碰撞。

3、發(fā)生哈希碰撞后,會繼續(xù)比較該下標處所有的key值,如果equals返回true,進行覆蓋操作,false,就在最后一個鍵值對后面進行追加操作,形成單向鏈表。

4、如果鏈表長度>=8,數(shù)組長度<64就進行擴容操作,并且會重新排序,若>=64則會形成紅黑樹。

5、當調(diào)用remove方法時,會刪除元素,當紅黑樹剩余的鍵值對個數(shù)<=6時,會重新還原成單向鏈表。

?

2、如何解決哈希沖突

1、拉鏈法(用的)

2、在哈希法

3、創(chuàng)建公共溢出區(qū)

4、開放尋址法:

(1)線性探測法

(2)平方探測法

2.1你知道HahsMap死循環(huán)問題嗎 ?

HashMap在擴容數(shù)組的時候,會將舊數(shù)據(jù)遷徙到新數(shù)組中,這個操作會將原來鏈表中的數(shù)據(jù)顛倒,比如a->b->null,轉(zhuǎn)換成b->a->null這個過程單線程是沒有問題的,但是在多線程環(huán)境,就可,能會出現(xiàn)a->b->a->b....,這就是死循環(huán)

?

在JDK1.8后,做了改進保證了轉(zhuǎn)換后鏈表順序一致,死循環(huán)問題得到了解決。但還是會出現(xiàn)高并發(fā)時數(shù)據(jù)丟失的問題,因此在多線程情況下還是建議使用ConcurrentHashMap來保證線程安全問題

3、Concurrenthashmap 為什么是線程安全的?

TreeMap,HashMap,LinkedHashMap 的區(qū)別?

LinkedHashMap 可以保證 HashMap 集合有序。存入的順序和取出的順序一致。

TreeMap 實現(xiàn)SortMap 接口,能夠把它保存的記錄根據(jù)鍵排序,默認是按鍵值的升序排序,也可以指定排序的比較器,當用 Iterator 遍歷 TreeMap 時,得到的記錄是排過序的。

HashMap 不保證順序,即為無序的,具有很快的訪問速度。

4、super和this的共同點的區(qū)別

this引用當前對象的實例變量或方法,幫助區(qū)分同名的局部變量和成員變量。

而 super引用父類的成員變量或方法,通常用來調(diào)用父類的方法或構(gòu)造函數(shù)。

this 和 super 的共同點在于它們都用于訪問對象的屬性或方法,但 this 指向當前實例,而 super 指向父類。

5、final關(guān)鍵字

被final修飾的類不能被繼承,修飾方法不能被重寫,修飾的變量不能改變。

6、集合

6.1、map

鍵值對,鍵值key是不能重復的,value可以,一個key對應一個value

treemap有序,hashmap無序

6.2、set

不可重復的集合,只能用iterator實現(xiàn)單項遍歷

6.3List

有序可重復,用 Iterator 實現(xiàn)單向遍歷,用ListIterator 實現(xiàn)雙向遍歷

6.4、Queu

先進先出,offer()來添加元素,使用 poll()來移除元素

6.5、Stack

遵從后進先出原則,

7、ArrayList,Vector, LinkedList 的存儲性能和特性?

ArrayList 和 Vector 都是使用數(shù)組方式存儲數(shù)據(jù),Vector用了synchronized方法(線程安全)改查快,而 LinkedList 使用雙向鏈表實現(xiàn)存儲,增刪快

8、內(nèi)存泄漏和溢出

泄露是應用程序在申請內(nèi)存后,無法釋放已經(jīng)申請的內(nèi)存空間,及時關(guān)閉流和數(shù)據(jù)庫鏈接釋放

溢出是申請內(nèi)存時,沒有足夠的內(nèi)存空間供其使用,分批提交。

9、int和Integer的區(qū)別

Integer是int的包裝類,int是基本類型,直接存儲數(shù)值;Integer是對象,里面有方法

10、String、StringBuilder、StringBuffer區(qū)別

String字符串常量,不可變,使用字符串拼接時是不同的 2 個空間

StringBuffer字符串變量,可變,線程安全,字符串拼接直接在字符串后追加

StringBuilder字符串變量,可變,非線程安全,字符串拼接直接在字符串后追加

11、hashtable和hashmap的區(qū)別

hashtable是線程安全的,不允許key和value值為null,多一個elements方法

hashmap是非線程安全的,key和value可以為null

12、方法重載的規(guī)則?

方法名一致,參數(shù)列表中參數(shù)的順序,類型,個數(shù)不同。

重載與方法的返回值無關(guān),存在于父類和子類,同類中。

可以拋出不同的異常,可以有不同修飾符。

13、方法的重寫的規(guī)則

參數(shù)列表、方法名、返回值類型必須完全一致,構(gòu)造方法不能被重寫;

final修飾的方法不可以

聲明為 static 的方法不存在重寫

訪問權(quán)限不能比父類低,

異常拋出范圍不能比父類大

14、thow和thows的區(qū)別

thow:

在方法體內(nèi),表拋出異常,由方法體內(nèi)的語句處理。執(zhí)行thow就是一定拋出異常

thows:

用在方法聲明后面,表示如果拋出異常,由該方法的調(diào)用者來進行異常的處理。表示出現(xiàn)異常的一種可能性,并不一定會發(fā)生這種異常。

15.、抽象(abstract)類和接口的區(qū)別?

1、接口中所有的方法都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。

2、類可以實現(xiàn)所有的接口,但只能繼承一個抽象類

3、類實現(xiàn)接口,必須實現(xiàn)接口中所有的方法,但是繼承抽象類不用,不過這個類也成抽象類

4、抽象類可以在不提供接口方法實現(xiàn)的情況下實現(xiàn)接口。

5、Java 接口中聲明的變量默認都是 final 的。抽象類可以包含非 final 的變量。

7、接口是絕對抽象的,不可以被實例化(java 8 已支持在接口中實現(xiàn)默認的方法)。抽象類也不

可以被實例化,但是,如果它包含 main 方法的話是可以被調(diào)用的。

16、Java的基本類型和字節(jié)大小

布爾型 boolean 8 位;字節(jié)型 byte 8 位; 字符型 char 16 位;

短整型 short 16 位;整形 int 32 位; 長整形 long 64 位;

浮點型 float 32 位;雙精度 double 64 位;

17、訪問修飾符的區(qū)別訪問級別?

public:公共的,都可以訪問

protected:受保護的,只要同類中、同包下、子類中可以訪問

沒有訪問修飾符:只能同類中、同包下可以訪問

private:私有的,只能同類中可以訪問

18、HashSet 的底層實現(xiàn)是什么?

底層是hashmap,hashset的值就是hashmap的key存在hashmap

19、為什么重寫 equals 時必須重寫 hashCode 方法?

如果兩個對象相等,則hashcode一定相等,但是hashcode默認是對對堆上的對象產(chǎn)生獨特值,如果沒有重寫hashcode,兩個對象無論如何都不會相等

20、HashSet 和 TreeSet 有什么區(qū)別?

hashset是由一個 hash 表來實現(xiàn)的,因此,它的元素是無序的。O(1)

TreeSet 是由一個樹形的結(jié)構(gòu)來實現(xiàn)的,它里面的元素是有序的O(logn)

21、Java 中的四大引用分別是什么?

1、強引用 String s = "abc",只要強引用存在,則垃圾回收器就不會回收這個對象。

2、軟引用 如果內(nèi)存足夠,不回收,如果內(nèi)存不足,則回收

3、弱引用 一旦發(fā)現(xiàn)了只具有弱引用的對象,不管當前內(nèi)存空間足夠與否,都會回收它的內(nèi)存

4、虛引用 在任何時候都可能被垃圾回收器回收

22、數(shù)組在內(nèi)存中如何分配

使用 new 關(guān)鍵字創(chuàng)建的時候,會在堆上分配內(nèi)存空間,每個數(shù)組成員是一個引用(指針)

引用到棧上的空間。

23、Java 中怎么創(chuàng)建一個不可變對象?

1.對象的狀態(tài)在構(gòu)造函數(shù)之后都不能被修改,任何修改應該通過創(chuàng)建一個新對象來實現(xiàn).

2.所有的對象屬性應該都設置為 final。

3.對象創(chuàng)建要正確,例如:對象的應用不能在構(gòu)造函數(shù)中被泄露出去

4.對象要設置為 final,確保不要繼承的 Class 修改了 immutability 特性

24、Java 中++操作符是線程安全的嗎?

不是線程安全的操作,它涉及到多個指令,如讀取變量值,增加,然后存儲回內(nèi)存,這個過程可

能會出現(xiàn)多個線程交差。

25、==與equals()區(qū)別

一般用==比較基本類型,是不是指向同一個內(nèi)存空間。

用equals比較對象,只有對象可以調(diào)用,默認是比較對象地址是否相同,比如 String 的 equals 是比較的內(nèi)容。

26、final,finalize 和 finally 的不同之處?

final 用于聲明屬性,方法和類,

finally 是異常處理語句結(jié)構(gòu)的一部分,表示總是執(zhí)行

finalize 是 Object 類的一個方法,在垃圾收集器執(zhí)行的時候會調(diào)用被回收對象的此方法,可以

覆蓋此方法提供垃圾收集時的其他資源回收,例如關(guān)閉文件等

27、Java 的多態(tài)是什么,表現(xiàn)在哪里?**

允許不同類的對象對同一消息做出響應。即同一消息可以根據(jù)發(fā)送對象的不同而采用多種不同的行為方式

1、有繼承 2、有重寫 3、要有父類引用指向子類對象。

28、static類型有什么特點

1、靜態(tài)的屬性:隨著類的加載而加載,該屬性不在屬于某個對象,屬于整個類

2、靜態(tài)的方法:直接用類名調(diào)用,靜態(tài)方法里不能訪問非靜態(tài)成員變量

3、靜態(tài)類:不能直接創(chuàng)建對象,不可被繼承

在 static 方法中不能使用 this 或者 super 關(guān)鍵字

29、Java 創(chuàng)建對象的幾種方式?

1.new 創(chuàng)建新對象;

2.通過反射機制;

3.采用 clone 機制;

4.通過序列化機制

30、&和&&的區(qū)別?

&是位運算符,表示按位與運算,&&是邏輯運算符,表示邏輯與(and)

31、在 java 源文件中可以有多個類嗎內(nèi)部類除外?

一個.java 源文件中可以包括多個類(不是內(nèi)部類),但是單個文件中只能有一個 public 類,

并且該 public 類必須與文件名相同

32.如何正確的退出多層嵌套循環(huán)?

1、使用標號和 break;

2、通過在外層循環(huán)中添加標識符

3、return

33.內(nèi)部類有什么作用?

1、內(nèi)部類可以很好的實現(xiàn)隱藏,一般的非內(nèi)部類,是不允許有 private 與 protected 權(quán)限的,

但內(nèi)部類可以

2、內(nèi)部類擁有外圍類的所有元素的訪問權(quán)限

3、可是實現(xiàn)多重繼承

4、可以避免修改接口而實現(xiàn)同一個類中兩種同名方法的調(diào)用

34、深拷貝和淺拷貝的區(qū)別

淺拷貝:被復制對象的所有變量都和原來對象相同,但是其他對象的引用還是指向原來對象

深拷貝:其他對象的引用指向被復制的新對象

35、值傳遞和引用傳遞

值傳遞是,傳遞了對象的一個副本,在上面做的改變,不會影響到原對象

引用傳遞,就是傳遞對象的引用,對引用對象做出的改變,會影響到原對象

36、成員變量和局部變量的區(qū)別有哪些?

成員變量是屬于類的,在堆內(nèi)存,成員變量是對象的一部分,它隨著對象的創(chuàng)建而存在,默認值而賦值

局部變量是在方法中定義的,存在于棧內(nèi)存,局部變量隨著方法的調(diào)用而自動消失。不會自動賦值

37、靜態(tài)方法和實例方法有何不同?

調(diào)用靜態(tài)方法可以無需創(chuàng)建對象

靜態(tài)方法在訪問本類的成員時,只允許訪問靜態(tài)成員(即靜態(tài)成員變量和靜態(tài)方法),實例方法則無此限制

38、多態(tài)的優(yōu)點?

可替換性(substitutability)。多態(tài)對已存在代碼具有可替換性

可擴充性(extensibility)。多態(tài)對代碼具有可擴充性。

39、Java 面向?qū)ο蟮奶卣饔心男┓矫妫?/p>

1、抽象

2、繼承

3、封裝

4、多態(tài)

40、什么是反射

反射就是動態(tài)加載對象,并對對象進行剖析。

在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法,這種動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的功能成為 Java 反射機制

41、反射的作用

1)在運行時判斷任意一個對象所屬的類

2)在運行時構(gòu)造任意一個類的對象

3)在運行時判斷任意一個類所具有的成員變量和方法

4)在運行時調(diào)用任意一個對象的方法

42、break 和 continue 的區(qū)別?

break 用于完全結(jié)束一個循環(huán)

continue 用于跳過本次循環(huán),繼續(xù)下次循環(huán)。

43、Collection 和 Collections 的區(qū)別?

Collection 是集合類的上級接口,繼承與他的接口主要有 Set 和 List.

Collections 是針對集合類的一個幫助類,他提供一系列靜態(tài)方法實現(xiàn)對各種集合的搜索、排序、

線程安全化等操作。

44、Error 和 Exception 有什么區(qū)別?

error表示問題很嚴重,比如說內(nèi)存溢出。不可能指望程序能處理這樣的情況

Exception 運行異?;蛘呔幾g異常

45、Comparable 和 Comparator 接口的區(qū)別?

Comparable 接口只包含一個 compareTo()方法。它返回負數(shù),0,正數(shù)來表明輸入對象小于,等于,大于已經(jīng)存在的對象。

Comparator 接口包含compare()和 equals()兩個方法。

46、switch 能否作用在 byte,long,String 上?

switch 不可作用于 long、double、float、boolean,包括他們的包裝類

switch 中可以是字符串類型,String(Java1.7 以后才可以作用在 String 上)

switch 可以是枚舉類型(JDK1.5 之后)

47、什么是迭代器(Iterator)?

Iterator 接口提供了很多對集合元素進行迭代的方法。每一個集合類都包含了可以返回迭代器

實例的迭代方法。迭代器可以在迭代的過程中刪除底層集合的元素。

克隆(cloning)或者是序列化(serialization)的語義和含義是跟具體的實現(xiàn)相關(guān)的。因此,應該

由集合類的具體實現(xiàn)來決定如何被克隆或者是序列化。

48、Iterator 和 ListIterator 的區(qū)別是什么?

Iterator 可用來遍歷 Set 和 List 集合,但是 ListIterator 只能用來遍歷 List。

Iterator 對集合只能是前向遍歷,ListIterator 既可以前向也可以后向。

ListIterator 實現(xiàn)了 Iterator 接口,并包含其他的功能,比如:增加元素,替換元素,獲取前

一個和后一個元素的索引,等等。

49、Enumeration 接口和 Iterator 接口的區(qū)別有哪些?

Enumeration 速度是 Iterator 的 2 倍,同時占用更少的內(nèi)存。但是,Iterator 遠遠比 Enumeration安全,因為其他線程不能夠修改正在被 iterator 遍歷的集合里面的對象

同時,Iterator 允許調(diào)用者刪除底層集合里面的元素,而 Enumeration 不可以。

50、字符串常量池到底存在于內(nèi)存空間的哪里?

jdk 6.0 字符串常量池在方法區(qū),方法區(qū)的具體體現(xiàn)可以看做是堆中的永久區(qū)。

jdk 7.0 java 虛擬機規(guī)范中不再聲明方法區(qū),字符串常量池存放在堆空間中

jdk 8.0 java 虛擬機規(guī)范中又聲明了元空間,字符串常量池存放在元空間中

51、Java 中的編譯期常量是什么,使用它又什么風險?

公共靜態(tài)不可變(public static final )變量也就是我們所說的編譯期常量,這里的 public 可

選的。實際上這些變量在編譯時會被替換掉,因為編譯器知道這些變量的值,并且知道這些變量

在運行時不能改變。這種方式存在的一個問題是你使用了一個內(nèi)部的或第三方庫中的公有編譯時

常量,但是這個值后面被其他人改變了,但是你的客戶端仍然在使用老的值,甚至你已經(jīng)部署了

一個新的 jar。為了避免這種情況, 當你在更新依賴 JAR 文件時,確保重新編譯你的程序。

52、用哪兩種方式來實現(xiàn)集合的排序?

可以使用有序集合,如 TreeSet 或 TreeMap,你也可以使用有順序的的集合,如 list,然后通

過 Collections.sort() 來排序。

53、說出一些 JDK1.8 的新特性?

Lambda 表達式,允許像對象一樣傳遞匿名函數(shù)

Stream API:充分利用現(xiàn)代多核 CPU,可以寫出很簡潔的代碼

Date 與 Time API,最終,有一個穩(wěn)定、簡單的日期和時間庫可供你使用擴展方法,現(xiàn)在,接口中可以有靜態(tài)、默認方法

重復注解,現(xiàn)在你可以將相同的注解在同一類型上使用多次。

多線程

1線程創(chuàng)建

繼承Thread

實現(xiàn)Runnable接口

Callable和FutureTask

線程池

2線程池的底層

線程池,底層其實就是集合隊列,里面存儲線程對象,用的時候去抽即可,就不要頻繁創(chuàng)建線程了

3創(chuàng)建線程池的方式

JDK提供了關(guān)于創(chuàng)建線程池的方式

- `Executors`: 通過該類提供的靜態(tài)方法來獲得不同特點的線程池對象

- newFixedThreadPool

- newCachedThreadPool

- newScheduledThreadPool

- newSingleThreadExecutor

- ...

- `ThreadPoolExecutor`: 通過submit(Runnable task) 來提交任務,執(zhí)行任務

線程池**執(zhí)行任務**時,可以采用兩種方法:

> execute(): 沒有返回值,無法判斷任務是否執(zhí)行成功

>

> submit():會返回Future對象,通過該對象判斷任務是否執(zhí)行成功

線程池使用完要關(guān)閉時:

> shutdown() 關(guān)閉線程池

4ThreadPoolExecutor[重要]

ThreadPoolExecutor 很重要,有7個參數(shù)

參數(shù)名解釋備注int corePoolSize指定線程池的線程數(shù)量(核心線程數(shù))不能小于0int maximumPoolSize指定線程池可支持的最大線程數(shù)最大數(shù)量>=核心線程數(shù)long keepAliveTime指定臨時線程的最大存活時間不能小于0TimeUnit unit指定存活時間的單位(秒,分,時,天)時間單位BlockingQueue workQueue指定任務隊列ThreadFactory threadFactory指定哪個線程工廠創(chuàng)建線程RejectedExecutionHandler handler指定線程忙,任務隊列滿的時候新任務來了怎么辦?拒絕策略

這幾個參數(shù)解釋(某大型火鍋店會例子)

核心線程數(shù)5, 即店里面的固定員工5個 最大線程數(shù)15,即突然顧客太多,5個人忙不過來,臨時招聘10個人來干活 最大存活時間,即顧客不多的時候,這些臨時工可以待多長時間 時間單位 任務隊列10,即集合, 固定員工加上臨時工還處理不了顧客,在店門口放幾10張凳子 線程工廠, 如何創(chuàng)建出的線程? 即怎么找到的員工 拒絕策略. 當固定員工,臨時工,以及門口的凳子都坐滿了,不讓吃了,不讓排隊,直接拒絕

問: 什么時候創(chuàng)建臨時線程? 答: 新任務提交時發(fā)現(xiàn)核心線程都在忙,任務隊列也滿了,并且還可以創(chuàng)建臨時線程,此時才會創(chuàng)建線程

問:什么時候開始拒絕任務? 答:核心線程和臨時線程都在忙,任務隊列也滿了,新的任務過來就會拒絕

5線程調(diào)用start()和run()的區(qū)別

啟動線程start()方法,但不會立即執(zhí)行run()是可以產(chǎn)生必須退出的標志來停止線程

6.線程 B 怎么知道線程 A 修改了變量?

volatile 修飾變量

synchronized 修飾修改變量的方法

wait/notify

while 輪詢

7.synchronized 和 Volatile,CAS 比較?

synchronized 是悲觀鎖,屬于搶占式,會引起其他線程阻塞。

volatile 提供多線程共享變量可見性和禁止指令重排序優(yōu)化。

CAS 是基于沖突檢測的樂觀鎖(非阻塞)

關(guān)于線程API

1) 創(chuàng)建線程構(gòu)造方法

2) 啟動線程start,運行線程任務run

3) 獲得線程對象Thread.currentThread()

4) 線程休眠sleep()

----------------------

關(guān)于線程同步:

1 什么是線程不安全: 線程數(shù)據(jù)被其他線程篡改?

為什么被篡改? 是因為當前線程執(zhí)行過程中,別的線程搶走資源也執(zhí)行

2 什么是線程安全: 當前線程執(zhí)行時,不要讓別的線程搶走資源,這樣就不會篡改數(shù)據(jù)

3 如何做到? 就是給方法加鎖

4 兩種方案: 同步方法,同步代碼塊

5 注意事項: 保證鎖對象是同一個

----------------------

關(guān)于通信:

1) 什么叫線程通信?

2) 如何做到的? 調(diào)用哪些方法做到...

3) wait和notify使用時有注意事項:

是不是必須要寫在同步內(nèi)?

被誰調(diào)用?

wait和sleep有什么異同?

--------------------

了解死鎖,了解其他線程安全的方式,了解jdk中線程安全的類

線程的方法

線程創(chuàng)建

8、線程的?命周期?線程有?種狀態(tài)

線程通常有五種狀態(tài),創(chuàng)建,就緒,運?、阻塞和死亡狀態(tài):

1. 新建狀態(tài)(New):新創(chuàng)建了?個線程對象。

2. 就緒狀態(tài)(Runnable):線程對象創(chuàng)建后,其他線程調(diào)?了該對象的start?法。該狀態(tài)的線程位于

可運?線程池中,變得可運?,等待獲取CPU的使?權(quán)。

3. 運?狀態(tài)(Running):就緒狀態(tài)的線程獲取了CPU,執(zhí)?程序代碼。

4. 阻塞狀態(tài)(Blocked):阻塞狀態(tài)是線程因為某種原因放棄CPU使?權(quán),暫時停?運?。直到線程

進?就緒狀態(tài),才有機會轉(zhuǎn)到運?狀態(tài)。

5. 死亡狀態(tài)(Dead):線程執(zhí)?完了或者因異常退出了run?法,該線程結(jié)束?命周期。

阻塞的情況?分為三種:

1. 等待阻塞:運?的線程執(zhí)?wait?法,該線程會釋放占?的所有資源,JVM會把該線程放?“等待

池”中。進?這個狀態(tài)后,是不能?動喚醒的,必須依靠其他線程調(diào)?notify或notifyAll?法才能被

喚醒,wait是object類的?法

2. 同步阻塞:運?的線程在獲取對象的同步鎖時,若該同步鎖被別的線程占?,則JVM會把該線程放

?“鎖池”中。

3. 其他阻塞:運?的線程執(zhí)?sleep或join?法,或者發(fā)出了I/O請求時,JVM會把該線程置為阻塞狀

態(tài)。當sleep狀態(tài)超時、join等待線程終?或者超時、或者I/O處理完畢時,線程重新轉(zhuǎn)?就緒狀

態(tài)。sleep是Thread類的?法

9、sleep()、wait()、join()、yield()之間的的區(qū)別

1. sleep 是 Thread 類的靜態(tài)本地?法,wait 則是 Object 類的本地?法。

2. sleep?法不會釋放lock,但是wait會釋放,?且會加?到等待隊列中。

3. sleep?法不依賴于同步器synchronized,但是wait需要依賴synchronized關(guān)鍵字。

4. sleep不需要被喚醒(休眠之后推出阻塞),但是wait需要(不指定時間需要被別?中斷)。

5. sleep ?般?于當前線程休眠,或者輪循暫停操作,wait 則多?于多線程之間的通信。

6. sleep 會讓出 CPU 執(zhí)?時間且強制上下?切換,? wait 則不?定,wait 后可能還是有機會重新競

爭到鎖繼續(xù)執(zhí)?的。

7. yield()執(zhí)?后線程直接進?就緒狀態(tài),?上釋放了cpu的執(zhí)?權(quán),但是依然保留了cpu的執(zhí)?資

格,所以有可能cpu下次進?線程調(diào)度還會讓這個線程獲取到執(zhí)?權(quán)繼續(xù)執(zhí)?

8. join()執(zhí)?后線程進?阻塞狀態(tài),例如在線程B中調(diào)?線程A的join(),那線程B會進?到阻塞隊

列,直到線程A結(jié)束或中斷線程

10、對線程安全的理解

不是線程安全、應該是內(nèi)存安全,堆是共享內(nèi)存,可以被所有線程訪問,當多個線程訪問?個對象時,

如果不?進?額外的同步控制或其他的協(xié)調(diào)操作,調(diào)?這個對象的?為都可以獲得正確的結(jié)果,我們就

說這個對象是線程安全的。

堆是進程和線程共有的空間,分全局堆和局部堆。全局堆就是所有沒有分配的空間,局部堆就是?戶分

配的空間。堆在操作系統(tǒng)對進程初始化的時候分配,運?過程中也可以向系統(tǒng)要額外的堆,但是?完了

要還給操作系統(tǒng),要不然就是內(nèi)存泄漏。在Java中,堆是Java虛擬機所管理的內(nèi)存中最?的?塊,是所

有線程共享的?塊內(nèi)存區(qū)域,在虛擬機啟動時創(chuàng)建。堆所存在的內(nèi)存區(qū)域的唯??的就是存放對象實

例,?乎所有的對象實例以及數(shù)組都在這?分配內(nèi)存

棧是每個線程獨有的,保存其運?狀態(tài)和局部?動變量的。棧在線程開始的時候初始化,每個線程的棧

互相獨?,因此,棧是線程安全的。操作系統(tǒng)在切換線程的時候會?動切換棧。??臻g不需要在?級語

???顯式的分配和釋放。

?前主流操作系統(tǒng)都是多任務的,即多個進程同時運?。為了保證安全,每個進程只能訪問分配給??

的內(nèi)存空間,?不能訪問別的進程的,這是由操作系統(tǒng)保障的。

在每個進程的內(nèi)存空間中都會有?塊特殊的公共區(qū)域,通常稱為堆(內(nèi)存)。進程內(nèi)的所有線程都可以

訪問到該區(qū)域,這就是造成問題的潛在原因。

柚子快報邀請碼778899分享:jvm Java面試八股文

http://yzkb.51969.com/

推薦文章

評論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。

轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19467918.html

發(fā)布評論

您暫未設置收款碼

請在主題配置——文章設置里上傳

掃描二維碼手機訪問

文章目錄