2018JAVA面試題附答案(長期更新)
JAVA基礎
JAVA中的幾種基本型別,各佔用多少位元組?
下圖單位是bit,非位元組 1B=8bit
String能被繼承嗎?為什麼?
不可以,因為String類有final修飾符,而final修飾的類是不能被繼承的,實現細節不允許改變。平常我們定義的String str=”a”;其實和String str=new String(“a”)還是有差異的。
前者預設呼叫的是String.valueOf來返回String例項物件,至於呼叫哪個則取決於你的賦值,比如String num=1,呼叫的是
public static String valueOf(int i) {
return Integer.toString(i);
}
後者則是呼叫如下部分:
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
最後我們的變數都儲存在一個char陣列中
private final char value[];
String, Stringbuffer, StringBuilder 的區別。
String 字串常量(final修飾,不可被繼承),String是常量,當建立之後即不能更改。(可以通過StringBuffer和StringBuilder建立String物件(常用的兩個字串操作類)。)
StringBuffer 字串變數(執行緒安全),其也是final類別的,不允許被繼承,其中的絕大多數方法都進行了同步處理,包括常用的Append方法也做了同步處理(synchronized修飾)。其自jdk1.0起就已經出現。其toString方法會進行物件快取,以減少元素複製開銷。
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, 0, count);
}
return new String(toStringCache, true);
}
StringBuilder 字串變數(非執行緒安全)其自jdk1.5起開始出現。與StringBuffer一樣都繼承和實現了同樣的介面和類,方法除了沒使用synch修飾以外基本一致,不同之處在於最後toString的時候,會直接返回一個新物件。
public String toString() {
// Create a copy, don’t share the array
return new String(value, 0, count);
}
ArrayList 和 LinkedList 有什麼區別。
ArrayList和LinkedList都實現了List介面,有以下的不同點:
1、ArrayList是基於索引的資料介面,它的底層是陣列。它可以以O(1)時間複雜度對元素進行隨機訪問。與此對應,LinkedList是以元素列表的形式儲存它的資料,每一個元素都和它的前一個和後一個元素連結在一起,在這種情況下,查詢某個元素的時間複雜度是O(n)。
2、相對於ArrayList,LinkedList的插入,新增,刪除操作速度更快,因為當元素被新增到集合任意位置的時候,不需要像陣列那樣重新計算大小或者是更新索引。
3、LinkedList比ArrayList更佔記憶體,因為LinkedList為每一個節點儲存了兩個引用,一個指向前一個元素,一個指向下一個元素。
講講類的例項化順序,比如父類靜態資料,建構函式,欄位,子類靜態資料,建構函式,欄位,當 new 的時候, 他們的執行順序。
用過哪些 Map 類,都有什麼區別,HashMap 是執行緒安全的嗎,併發下使用的 Map 是什麼,他們內部原理分別是什麼,比如儲存方式, hashcode,擴容, 預設容量等。
hashMap是執行緒不安全的,HashMap是陣列+連結串列+紅黑樹(JDK1.8增加了紅黑樹部分)實現的,採用雜湊表來儲存的,
參照該連結:https://zhuanlan.zhihu.com/p/21673805
JAVA8 的 ConcurrentHashMap 為什麼放棄了分段鎖,有什麼問題嗎,如果你來設計,你如何設計。
參照:https://yq.aliyun.com/articles/36781
有沒有有順序的 Map 實現類, 如果有, 他們是怎麼保證有序的。
TreeMap和LinkedHashMap是有序的(TreeMap預設升序,LinkedHashMap則記錄了插入順序)。
參照:http://uule.iteye.com/blog/1522291
抽象類和介面的區別,類可以繼承多個類麼,介面可以繼承多個介面麼,類可以實現多個介面麼。
1、抽象類和介面都不能直接例項化,如果要例項化,抽象類變數必須指向實現所有抽象方法的子類物件,介面變數必須指向實現所有介面方法的類物件。
2、抽象類要被子類繼承,介面要被類實現。
3、介面只能做方法申明,抽象類中可以做方法申明,也可以做方法實現
4、接口裡定義的變數只能是公共的靜態的常量,抽象類中的變數是普通變數。
5、抽象類裡的抽象方法必須全部被子類所實現,如果子類不能全部實現父類抽象方法,那麼該子類只能是抽象類。同樣,一個實現介面的時候,如不能全部實現介面方法,那麼該類也只能為抽象類。
6、抽象方法只能申明,不能實現。abstract void abc();不能寫成abstract void abc(){}。
7、抽象類裡可以沒有抽象方法
8、如果一個類裡有抽象方法,那麼這個類只能是抽象類
9、抽象方法要被實現,所以不能是靜態的,也不能是私有的。
10、介面可繼承介面,並可多繼承介面,但類只能單根繼承。
繼承和聚合的區別在哪。
繼承指的是一個類(稱為子類、子介面)繼承另外的一個類(稱為父類、父介面)的功能,並可以增加它自己的新功能的能力,繼承是類與類或者介面與介面之間最常見的關係;在Java中此類關係通過關鍵字extends明確標識,在設計時一般沒有爭議性;
聚合是關聯關係的一種特例,他體現的是整體與部分、擁有的關係,即has-a的關係,此時整體與部分之間是可分離的,他們可以具有各自的生命週期,部分可以屬於多個整體物件,也可以為多個整體物件共享;比如計算機與CPU、公司與員工的關係等;表現在程式碼層面,和關聯關係是一致的,只能從語義級別來區分;
講講你理解的 nio和 bio 的區別是啥,談談 reactor 模型。
反射的原理,反射建立類例項的三種方式是什麼
反射中,Class.forName 和 ClassLoader 區別。
Class.forName(className)方法,其實呼叫的方法是Class.forName(className,true,classloader);注意看第2個boolean引數,它表示的意思,在loadClass後必須初始化。比較下我們前面準備jvm載入類的知識,我們可以清晰的看到在執行過此方法後,目標物件的 static塊程式碼已經被執行,static引數也已經被初始化。
再看ClassLoader.loadClass(className)方法,其實他呼叫的方法是ClassLoader.loadClass(className,false);還是注意看第2個 boolean引數,該引數表示目標物件被裝載後不進行連結,這就意味這不會去執行該類靜態塊中間的內容。因此2者的區別就顯而易見了
描述動態代理的幾種實現方式,分別說出相應的優缺點。
Jdk cglib jdk底層是利用反射機制,需要基於介面方式,這是由於
Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
Cglib則是基於asm框架,實現了無反射機制進行代理,利用空間來換取了時間,代理效率高於jdk
http://lrd.ele.me/2017/01/09/dynamic_proxy/
動態代理與 cglib 實現的區別
同上(基於invocationHandler和methodInterceptor)
為什麼 CGlib 方式可以對介面實現代理。
同上
final 的用途
寫出三種單例模式實現。
如何在父類中為子類自動完成所有的 hashcode 和 equals 實現?這麼做有何優劣。
請結合 OO 設計理念,談談訪問修飾符 public、private、protected、default 在應用設計中的作用。
訪問修飾符,主要標示修飾塊的作用域,方便隔離防護
同一個類 同一個包 不同包的子類 不同包的非子類
- 1
- 2
Private √
Default √ √
Protected √ √ √
Public √ √ √ √
public: Java語言中訪問限制最寬的修飾符,一般稱之為“公共的”。被其修飾的類、屬性以及方法不
僅可以跨類訪問,而且允許跨包(package)訪問。
private: Java語言中對訪問許可權限制的最窄的修飾符,一般稱之為“私有的”。被其修飾的類、屬性以
及方法只能被該類的物件訪問,其子類不能訪問,更不能允許跨包訪問。
protect: 介於public 和 private 之間的一種訪問修飾符,一般稱之為“保護形”。被其修飾的類、
屬性以及方法只能被類本身的方法及子類訪問,即使子類在不同的包中也可以訪問。
default:即不加任何訪問修飾符,通常稱為“預設訪問模式“。該模式下,只允許在同一個包中進行訪
問。
深拷貝和淺拷貝區別。
陣列和連結串列資料結構描述,各自的時間複雜度
error 和 exception 的區別,CheckedException,RuntimeException 的區別
請列出 5 個執行時異常。
同上
在自己的程式碼中,如果建立一個 java.lang.String 物件,這個物件是否可以被類載入器載入?為什麼
說一說你對 java.lang.Object 物件中 hashCode 和 equals 方法的理解。在什麼場景下需要重新實現這兩個方法。
參考上邊試題
在 jdk1.5 中,引入了泛型,泛型的存在是用來解決什麼問題。
泛型的本質是引數化型別,也就是說所操作的資料型別被指定為一個引數,泛型的好處是在編譯的時候檢查型別安全,並且所有的強制轉換都是自動和隱式的,以提高程式碼的重用率
http://baike.baidu.com/item/java%E6%B3%9B%E5%9E%8B
這樣的 a.hashcode() 有什麼用,與 a.equals(b)有什麼關係。
hashcode
hashcode()方法提供了物件的hashCode值,是一個native方法,返回的預設值與System.identityHashCode(obj)一致。
通常這個值是物件頭部的一部分二進位制位組成的數字,具有一定的標識物件的意義存在,但絕不定於地址。
作用是:用一個數字來標識物件。比如在HashMap、HashSet等類似的集合類中,如果用某個物件本身作為Key,即要基於這個物件實現Hash的寫入和查詢,那麼物件本身如何實現這個呢?就是基於hashcode這樣一個數字來完成的,只有數字才能完成計算和對比操作。
hashcode是否唯一
hashcode只能說是標識物件,在hash演算法中可以將物件相對離散開,這樣就可以在查詢資料的時候根據這個key快速縮小資料的範圍,但hashcode不一定是唯一的,所以hash演算法中定位到具體的連結串列後,需要迴圈連結串列,然後通過equals方法來對比Key是否是一樣的。
equals與hashcode的關係
equals相等兩個物件,則hashcode一定要相等。但是hashcode相等的兩個物件不一定equals相等。
https://segmentfault.com/a/1190000004520827
有沒有可能 2 個不相等的物件有相同的 hashcode。
有
Java 中的 HashSet 內部是如何工作的。
JVM 知識
什麼情況下會發生棧記憶體溢位。
如果執行緒請求的棧深度大於虛擬機器所允許的深度,將丟擲StackOverflowError異常。 如果虛擬機器在動態擴充套件棧時無法申請到足夠的記憶體空間,則丟擲OutOfMemoryError異常。
參照:http://wiki.jikexueyuan.com/project/java-vm/storage.html
JVM 的記憶體結構,Eden 和 Survivor 比例。
jvm 中一次完整的 GC 流程是怎樣的,物件如何晉升到老年代,說說你知道的幾種主要的jvm 引數。
你知道哪幾種垃圾收集器,各自的優缺點,重點講下 cms,包括原理,流程,優缺點
垃圾回收演算法的實現原理。
當出現了記憶體溢位,你怎麼排錯。
JVM 記憶體模型的相關知識瞭解多少,比如重排序,記憶體屏障,happen-before,主記憶體,工作記憶體等。
簡單說說你瞭解的類載入器。
講講 JAVA 的反射機制。
你們線上應用的 JVM 引數有哪些。
-server
Xms6000M
-Xmx6000M
-Xmn500M
-XX:PermSize=500M
-XX:MaxPermSize=500M
-XX:SurvivorRatio=65536
-XX:MaxTenuringThreshold=0
-Xnoclassgc
-XX:+DisableExplicitGC
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction=0
-XX:+CMSClassUnloadingEnabled
-XX:-CMSParallelRemarkEnabled
-XX:CMSInitiatingOccupancyFraction=90
-XX:SoftRefLRUPolicyMSPerMB=0
-XX:+PrintClassHistogram
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC
-Xloggc:log/gc.log
g1 和 cms 區別,吞吐量優先和響應優先的垃圾收集器選擇。
Cms是以獲取最短回收停頓時間為目標的收集器。基於標記-清除演算法實現。比較佔用cpu資源,切易造成碎片。
G1是面向服務端的垃圾收集器,是jdk9預設的收集器,基於標記-整理演算法實現。可利用多核、多cpu,保留分代,實現可預測停頓,可控。
http://blog.csdn.net/linhu007/article/details/48897597
請解釋如下 jvm 引數的含義:
-server -Xms512m -Xmx512m -Xss1024K
-XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxTenuringThreshold=20
XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly。
Server模式啟動
最小堆記憶體512m
最大512m
每個執行緒棧空間1m
永久代256
最大永久代256
最大轉為老年代檢查次數20
Cms回收開啟時機:記憶體佔用80%
命令JVM不基於執行時收集的資料來啟動CMS垃圾收集週期
開源框架知識
簡單講講 tomcat 結構,以及其類載入器流程。
tomcat 如何調優,涉及哪些引數。
講講 Spring 載入流程。
講講 Spring 事務的傳播屬性。
七種傳播屬性。
事務傳播行為
所謂事務的傳播行為是指,如果在開始當前事務之前,一個事務上下文已經存在,此時有若干選項可以指定一個事務性方法的執行行為。在TransactionDefinition定義中包括瞭如下幾個表示傳播行為的常量:
TransactionDefinition.PROPAGATION_REQUIRED:如果當前存在事務,則加入該事務;如果當前沒有事務,則建立一個新的事務。
TransactionDefinition.PROPAGATION_REQUIRES_NEW:建立一個新的事務,如果當前存在事務,則把當前事務掛起。
TransactionDefinition.PROPAGATION_SUPPORTS:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續執行。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務方式執行,如果當前存在事務,則把當前事務掛起。
TransactionDefinition.PROPAGATION_NEVER:以非事務方式執行,如果當前存在事務,則丟擲異常。
TransactionDefinition.PROPAGATION_MANDATORY:如果當前存在事務,則加入該事務;如果當前沒有事務,則丟擲異常。
TransactionDefinition.PROPAGATION_NESTED:如果當前存在事務,則建立一個事務作為當前事務的巢狀事務來執行;如果當前沒有事務,則該取值等價於TransactionDefinition.PROPAGATION_REQUIRED。
https://www.ibm.com/developerworks/cn/education/opensource/os-cn-spring-trans/
Spring 如何管理事務的。
程式設計式和宣告式
同上
Spring 怎麼配置事務(具體說出一些關鍵的 xml 元素)。
說說你對 Spring 的理解,非單例注入的原理?它的生命週期?迴圈注入的原理, aop 的實現原理,說說 aop 中的幾個術語,它們是怎麼相互工作的。
核心元件:bean,context,core,單例注入是通過單例beanFactory進行建立,生命週期是在建立的時候通過介面實現開啟,迴圈注入是通過後置處理器,aop其實就是通過反射進行動態代理,pointcut,advice等。
Aop相關:http://blog.csdn.net/csh624366188/article/details/7651702/
Springmvc 中 DispatcherServlet 初始化過程。
入口是web.xml中配置的ds,ds繼承了HttpServletBean,FrameworkServlet,通過其中的init方法進行初始化裝載bean和例項,initServletBean是實際完成上下文工作和bean初始化的方法。
http://www.mamicode.com/info-detail-512105.html
作業系統
Linux 系統下你關注過哪些核心引數,說說你知道的。
Tcp/ip io cpu memory
net.ipv4.tcp_syncookies = 1
#啟用syncookies
net.ipv4.tcp_max_syn_backlog = 8192
#SYN佇列長度
net.ipv4.tcp_synack_retries=2
#SYN ACK重試次數
net.ipv4.tcp_fin_timeout = 30
#主動關閉方FIN-WAIT-2超時時間
net.ipv4.tcp_keepalive_time = 1200
#TCP傳送keepalive訊息的頻度
net.ipv4.tcp_tw_reuse = 1
#開啟TIME-WAIT重用
net.ipv4.tcp_tw_recycle = 1
#開啟TIME-WAIT快速回收
net.ipv4.ip_local_port_range = 1024 65000
#向外連線的埠範圍
net.ipv4.tcp_max_tw_buckets = 5000
#最大TIME-WAIT數量,超過立即清除
net.ipv4.tcp_syn_retries = 2
#SYN重試次數
echo “fs.file-max=65535” >> /etc/sysctl.conf
sysctl -p
Linux 下 IO 模型有幾種,各自的含義是什麼。
epoll 和 poll 有什麼區別。
select的本質是採用32個整數的32位,即32*32= 1024來標識,fd值為1-1024。當fd的值超過1024限制時,就必須修改FD_SETSIZE的大小。這個時候就可以標識32*max值範圍的fd。
對於單程序多執行緒,每個執行緒處理多個fd的情況,select是不適合的。
1.所有的執行緒均是從1-32*max進行掃描,每個執行緒處理的均是一段fd值,這樣做有點浪費
2.1024上限問題,一個處理多個使用者的程序,fd值遠遠大於1024
所以這個時候應該採用poll,
poll傳遞的是陣列頭指標和該陣列的長度,只要陣列的長度不是很長,效能還是很不錯的,因為poll一次在核心中申請4K(一個頁的大小來存放fd),儘量控制在4K以內
epoll還是poll的一種優化,返回後不需要對所有的fd進行遍歷,在核心中維持了fd的列表。select和poll是將這個核心列表維持在使用者態,然後傳遞到核心中。但是隻有在2.6的核心才支援。
epoll更適合於處理大量的fd ,且活躍fd不是很多的情況,畢竟fd較多還是一個序列的操作
https://yq.aliyun.com/articles/10525
平時用到哪些 Linux 命令。
用一行命令檢視檔案的最後五行。
Tail -n 5 filename
用一行命令輸出正在執行的 java 程序。
ps -ef|grep Java
介紹下你理解的作業系統中執行緒切換過程。
程序和執行緒的區別。
Linux 實現並沒有區分這兩個概念(程序和執行緒)
1. 程序:程式的一次執行
2. 執行緒:CPU的基本排程單位
一個程序可以包含多個執行緒。
多執行緒
多執行緒的幾種實現方式,什麼是執行緒安全。
volatile 的原理,作用,能代替鎖麼。
畫一個執行緒的生命週期狀態圖。
sleep 和 wait 的區別。
Sleep是休眠執行緒,wait是等待,sleep是thread的靜態方法,wait則是object的方法。
Sleep依舊持有鎖,並在指定時間自動喚醒。wait則釋放鎖。
http://www.jianshu.com/p/4ec3f4b3903d
Lock 與 Synchronized 的區別。
首先兩者都保持了併發場景下的原子性和可見性,區別則是synchronized的釋放鎖機制是交由其自身控制,且互斥性在某些場景下不符合邏輯,無法進行干預,不可人為中斷等。
而lock常用的則有ReentrantLock和readwritelock兩者,添加了類似鎖投票、定時鎖等候和可中斷鎖等候的一些特性。此外,它還提供了在激烈爭用情況下更佳的效能。
http://blog.csdn.net/vking_wang/article/details/9952063
synchronized 的原理是什麼,解釋以下名詞:重排序,自旋鎖,偏向鎖,輕量級鎖,可重入鎖,公平鎖,非公平鎖,樂觀鎖,悲觀鎖。
用過哪些原子類,他們的原理是什麼。
用過執行緒池嗎,newCache 和 newFixed 有什麼區別,他們的原理簡單概括下,建構函式的各個引數的含義是什麼,比如 coreSize,maxsize 等。
newSingleThreadExecutor返回以個包含單執行緒的Executor,將多個任務交給此Exector時,這個執行緒處理完一個任務後接著處理下一個任務,若該執行緒出現異常,將會有一個新的執行緒來替代。
newFixedThreadPool返回一個包含指定數目執行緒的執行緒池,如果任務數量多於執行緒數目,那麼沒有沒有執行的任務必須等待,直到有任務完成為止。
newCachedThreadPool根據使用者的任務數建立相應的執行緒來處理,該執行緒池不會對執行緒數目加以限制,完全依賴於JVM能建立執行緒的數量,可能引起記憶體不足。
底層是基於ThreadPoolExecutor實現,藉助reentrantlock保證併發。
coreSize核心執行緒數,maxsize最大執行緒數。
http://ifeve.com/java-threadpoolexecutor/
執行緒池的關閉方式有幾種,各自的區別是什麼。
假如有一個第三方介面,有很多個執行緒去呼叫獲取資料,現在規定每秒鐘最多有 10 個執行緒同時呼叫它,如何做到。
ScheduledThreadPoolExecutor 設定定時,進行排程。
public ScheduledThreadPoolExecutor(int corePoolSize,
ThreadFactory threadFactory) {
super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS,
new DelayedWorkQueue(), threadFactory);
}
spring 的 controller 是單例還是多例,怎麼保證併發的安全。
單例
通過單例工廠 DefaultSingletonBeanRegistry實現單例
通過保AsyncTaskExecutor持安全
用三個執行緒按順序迴圈列印 abc 三個字母,比如 abcabcabc。
public static void main(String[] args) {
final String str=”abc”;
ExecutorService executorService= Executors.newFixedThreadPool(3);
executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println(“1”+str);
}
});executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println(“2”+str);
}
});executorService.execute(new Runnable() {
@Override
public void run() {
System.out.println(“2”+str);
}
});
}
ThreadLocal 用過麼,用途是什麼,原理是什麼,用的時候要注意什麼。
Threadlocal底層是通過threadlocalMap進行儲存鍵值 每個ThreadLocal類建立一個Map,然後用執行緒的ID作為Map的key,例項物件作為Map的value,這樣就能達到各個執行緒的值隔離的效果。
ThreadLocal的作用是提供執行緒內的區域性變數,這種變數線上程的生命週期內起作用,減少同一個執行緒內多個函式或者元件之間一些公共變數的傳遞的複雜度。
誰設定誰負責移除
http://qifuguang.me/2015/09/02/[Java%E5%B9%B6%E5%8F%91%E5%8C%85%E5%AD%A6%E4%B9%A0%E4%B8%83]%E8%A7%A3%E5%AF%86ThreadLocal/
如果讓你實現一個併發安全的連結串列,你會怎麼做。
有哪些無鎖資料結構,他們實現的原理是什麼。
講講 java 同步機制的 wait 和 notify。
多執行緒如果執行緒掛住了怎麼辦。
countdowlatch 和 cyclicbarrier 的內部原理和用法,以及相互之間的差別。
CountDownLatch是一個同步輔助類,在完成一組正在其他執行緒中執行的操作之前,它執行一個或者多個執行緒一直處於等待狀態。
CyclicBarrier要做的事情是,讓一組執行緒到達一個屏障(也可以叫同步點)時被阻塞,直到最後一個執行緒到達屏障時,屏障才會開門,所有被屏障攔截的執行緒才會繼續執行。
CyclicBarrier初始化的時候,設定一個屏障數。執行緒呼叫await()方法的時候,這個執行緒就會被阻塞,當呼叫await()的執行緒數量到達屏障數的時候,主執行緒就會取消所有被阻塞執行緒的狀態。
前者是遞減,不可迴圈,後者是遞加,可迴圈用
countdowlatch 基於abq cb基於ReentrantLock Condition
http://www.jianshu.com/p/a101ae9797e3
http://blog.csdn.net/tolcf/article/details/50925145
使用 synchronized 修飾靜態方法和非靜態方法有什麼區別。
簡述 ConcurrentLinkedQueue LinkedBlockingQueue 的用處和不同之處。
LinkedBlockingQueue 是一個基於單向連結串列的、範圍任意的(其實是有界的)、FIFO 阻塞佇列。
ConcurrentLinkedQueue是一個基於連結節點的無界執行緒安全佇列,它採用先進先出的規則對節點進行排序,當我們新增一個元素的時候,它會新增到佇列的尾部,當我們獲取一個元素時,它會返回佇列頭部的元素。它採用了“wait-free”演算法來實現,該演算法在Michael & Scott演算法上進行了一些修改, Michael & Scott演算法的詳細資訊可以參見參考資料一。
http://ifeve.com/concurrentlinkedqueue/
http://ifeve.com/juc-linkedblockingqueue/
http://blog.csdn.net/xiaohulunb/article/details/38932923
導致執行緒死鎖的原因?怎麼解除執行緒死鎖。
死鎖問題是多執行緒特有的問題,它可以被認為是執行緒間切換消耗系統性能的一種極端情況。在死鎖時,執行緒間相互等待資源,而又不釋放自身的資源,導致無窮無盡的等待,其結果是系統任務永遠無法執行完成。死鎖問題是在多執行緒開發中應該堅決避免和杜絕的問題。
一般來說,要出現死鎖問題需要滿足以下條件:
1. 互斥條件:一個資源每次只能被一個執行緒使用。
2. 請求與保持條件:一個程序因請求資源而阻塞時,對已獲得的資源保持不放。
3. 不剝奪條件:程序已獲得的資源,在未使用完之前,不能強行剝奪。
4. 迴圈等待條件:若干程序之間形成一種頭尾相接的迴圈等待資源關係。
只要破壞死鎖 4 個必要條件之一中的任何一個,死鎖問題就能被解決。
https://www.ibm.com/developerworks/cn/java/j-lo-deadlock/
非常多個執行緒(可能是不同機器),相互之間需要等待協調,才能完成某種工作,問怎麼設計這種協調方案。
此問題的本質是保持順序執行。可以使用executors
TCP 與 HTTP
http1.0 和 http1.1 有什麼區別。
HTTP 1.0主要有以下幾點變化:
請求和相應可以由於多行首部欄位構成
響應物件前面添加了一個響應狀態行
響應物件不侷限於超文字
伺服器與客戶端之間的連線在每次請求之後都會關閉
實現了Expires等傳輸內容的快取控制
內容編碼Accept-Encoding、字符集Accept-Charset等協商內容的支援
這時候開始有了請求及返回首部的概念,開始傳輸不限於文字(其他二進位制內容)
TCP 三次握手和四次揮手的流程,為什麼斷開連線要 4 次,如果握手只有兩次,會出現什麼。
第一次握手(SYN=1, seq=x):
客戶端傳送一個 TCP 的 SYN 標誌位置1的包,指明客戶端打算連線的伺服器的埠,以及初始序號 X,儲存在包頭的序列號(Sequence Number)欄位裡。
傳送完畢後,客戶端進入
SYN_SEND
狀態。第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1):
伺服器發回確認包(ACK)應答。即 SYN 標誌位和 ACK 標誌位均為1。伺服器端選擇自己 ISN 序列號,放到 Seq 域裡,同時將確認序號(Acknowledgement Number)設定為客戶的 ISN 加1,即X+1。
傳送完畢後,伺服器端進入SYN_RCVD
狀態。第三次握手(ACK=1,ACKnum=y+1)
客戶端再次傳送確認包(ACK),SYN 標誌位為0,ACK 標誌位為1,並且把伺服器發來 ACK 的序號欄位+1,放在確定欄位中傳送給對方,並且在資料段放寫ISN的+1
傳送完畢後,客戶端進入 ESTABLISHED
狀態,當伺服器端接收到這個包時,也進入 ESTABLISHED
狀態,TCP 握手結束。
第一次揮手(FIN=1,seq=x)
假設客戶端想要關閉連線,客戶端傳送一個 FIN 標誌位置為1的包,表示自己已經沒有資料可以傳送了,但是仍然可以接受資料。
傳送完畢後,客戶端進入 FIN_WAIT_1 狀態。
第二次揮手(ACK=1,ACKnum=x+1)
伺服器端確認客戶端的 FIN 包,傳送一個確認包,表明自己接受到了客戶端關閉連線的請求,但還沒有準備好關閉連線。
傳送完畢後,伺服器端進入 CLOSE_WAIT 狀態,客戶端接收到這個確認包之後,進入 FIN_WAIT_2 狀態,等待伺服器端關閉連線。
第三次揮手(FIN=1,seq=y)
伺服器端準備好關閉連線時,向客戶端傳送結束連線請求,FIN 置為1。
傳送完畢後,伺服器端進入 LAST_ACK 狀態,等待來自客戶端的最後一個ACK。
第四次揮手(ACK=1,ACKnum=y+1)
客戶端接收到來自伺服器端的關閉請求,傳送一個確認包,並進入 TIME_WAIT狀態,等待可能出現的要求重傳的 ACK 包。
伺服器端接收到這個確認包之後,關閉連線,進入 CLOSED 狀態。
TIME_WAIT 和 CLOSE_WAIT 的區別。
相關推薦
2018JAVA面試題附答案(長期更新)
JAVA基礎JAVA中的幾種基本型別,各佔用多少位元組? 下圖單位是bit,非位元組 1B=8bit String能被繼承嗎?為什麼?不可以,因為String類有final修飾符,而final修飾的類是不能被繼承的,實現細節不允許改變。平常我們定義的String str=”a
2017JAVA面試題附答案
宣告,本人能力有限,只是列出來參考,不對之處歡迎指正。 本人沒有什麼公眾號,評論裡面有人冒充我,大家注意甄別 JAVA基礎 JAVA中的幾種基本型別,各佔用多少位元組? 下圖單位是bit,非位元組 1B=8bit String能被繼承嗎?為什麼? 不可以
大資料開發工程師面試題(附答案)
之前採訪畢業生的時候,有小夥伴提出意見,想看小編分享一些面試的乾貨,於是小編不負眾望,今天給大家帶來了一篇大神級面經,希望可以幫助即將畢業或正在找工作的小夥伴兒們,祝你們早日找到心儀的工作! 在這裡我還是要推薦下我自己建的大資料學習交流qq裙:458345782, 裙
JAVA 中級面試題 (附答案)
問題大多取自點選開啟連結 在網上找了一些答案,也添加了一些幾乎是必問的題 一、 基礎知識: 1) HashMap,LinkedHashMap,TreeMap的區別 1. HashMap,LinkedHashMap,TreeMap都屬於Map。
一份不錯的php面試題(附答案)
一份不錯的php面試題,附答案,有準備換工作的同學可以參考一下. 一、基礎題 1. 寫出如下程式的輸出結果 <?php $str1 = null; $str2 = false; echo $str1==$str2 ? '相等' : '不相等'; $str3 = '';
C#面試題——附答案
錯誤呢?不清楚了。改正:將subtract放在<script runat="server"></script>之間。<script runat="server"> int subtract(int num1, int num2)
找工作的你不容錯過的45個PHP面試題附答案(下篇)
找工作的你不容錯過的45個PHP面試題附答案(上篇) Q28:你將如何使用PHP建立Singleton類? /** * Singleton class * */ final class UserFactory { /** * Call this method to get
Java 常考面試題及答案(吐血總結)持續更新...
1、解釋Java面向物件的特徵: 抽象、封裝、繼承、多型。 2、面向物件的好處是什麼? 3、Java常用的關鍵字、修飾符的使用 4、Java中的引數傳遞(值傳遞、引用傳遞) 5、簡述內部類、靜態內部類、匿名內部類的區別 6、try catch finally的
執行緒與程序最通俗易懂的解釋(附面試題與答案)
程序和執行緒都是一個時間段的描述,是CPU工作時間段的描述。一、CPU+RAM+各種資源(比如顯示卡,光碟機,鍵盤,GPS, 等等外設)構成我們的電腦,但是電腦的執行,實際就是CPU和相關暫存器以及RAM之間的事情。二、CPU太快,太快,太快了,暫存器僅僅能夠追的上他的腳步,RAM和別的掛在各總線上的裝置完全
面試題及答案總結(實時更新)
一、Mybatis中DAO介面的實現機制 答:首先Mybatis會載入配置檔案,根據配置檔案生成sqlsessionFactory工廠,通過工廠獲取sqlsession動態代理物件,將DAO介面交給sqlsession這個動態代理物件,它就會通過invoke方法
金三銀四:螞蟻金服JAVA開發面試題及答案之一面(持續更新)
開發十年,就只剩下這套架構體系了! >>>
PHP面試題及答案解析(8)—PHP綜合應用題
java應用程序 外殼 sleep 服務應用程序 解釋 源碼 use lee eve 1.寫出下列服務的用途和默認端口。 ftp、ssh、http、telnet、https ftp:File Transfer Protocol,文件傳輸協議,是應用層的協議,它基於傳輸層,
100+經典Java面試題及答案解析
是什麽 自定義 我們 計數 接口類 同步方法 main err ans 面向對象編程(OOP) Java是一個支持並發、基於類和面向對象的計算機編程語言。下面列出了面向對象軟件開發的優點: 代碼開發模塊化,更易維護和修改。 代碼復用。 增強代碼的可靠性和靈活
JavaScript基本的面試題及答案
對象 con cnblogs typeof fin 如果 defined 輸出結果 是什麽 1、使用typeof bar==="object"來確定bar是否是對象的潛在陷阱是什麽?如何避免這個陷阱? 例: var bar=null; console.log(typeof
Spring面試題和答案
tar aos 好處 責任 strong enc 進行 需求 getter Spring 概述 1. 什麽是spring? Spring 是個java企業級應用的開源開發框架。Spring主要用來開發Java應用,但是有些擴展是針對構建J2EE平臺的web應用。Sprin
Java String 面試題以及答案
other dart ole ash 技術 目錄 不同 iter 存在 String是最常使用的Java類之一,整理的了一些重要的String知識分享給大家。 作為一個Java新手程序員,對String進行更深入的了解很有必要。如果你是有幾年Java開發經驗,可以根據目錄選
史上最全Java多線程面試題及答案
blog 上下文 exec 線程 單例 通信 流轉 排查 創建 多線程有什麽用? 線程和進程的區別是什麽? Java實現線程有哪幾種方式? 啟動線程方法start()和run()有什麽區別? 怎麽終止一個線程?如何優雅地終止線程? 一個線程的生命周期
劍指offer面試題-Java版-持續更新
紅色 縮小 進行 n-1 bubuko 變量 argument style 對象 最近在用Java刷劍指offer(第二版)的面試題。書中原題的代碼采用C++編寫,有些題的初衷是為了考察C++的指針、模板等特性,這些題使用Java編寫有些不合適。但多數題還是考察通用的算法、
2018年Android面試題含答案(上)
密碼學 進程的地址空間 變量 細節 一段時間 設備驅動 橋梁 異常 graph 這些面試題是我在今年年初換工作的時候整理,沒有重點。包括java基礎,數據結構,網絡,Android相關等等。適合中高級工程師。由於內容過多,將會分為上下兩部分。希望能夠幫到一些朋友,如果幫助到
2018年Android面試題含答案--適合中高級(下)
所在 sync gpo 成了 廠商 end 解釋 同步 變換 1、Activity生命周期? onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDetroy(