作業系統
程序間通信:
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
http://www.haiyun.me/category/system/
Linux 下 IO 模型有幾種,各自的含義是什麼。
阻塞式io,非阻塞io,io複用模型,信号驅動io模型,異步io模型。
https://yq.aliyun.com/articles/46404
https://yq.aliyun.com/articles/46402
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 指令。
Ls,find,tar,tail,cp,rm,vi,grep,ps,pkill等等
https://yq.aliyun.com/articles/69417?spm=5176.100240.searchblog.18.Zrbh9R
用一行指令檢視檔案的最後五行。
Tail -n 5 filename
用一行指令輸出正在運作的 java 程序。
ps -ef|grep Java
介紹下你了解的作業系統中線程切換過程。
控制權的轉換,根據優先級切換上下文(使用者,寄存器,系統)
http://www.cnblogs.com/kkshaq/p/4544426.html
程序和線程的差別。
Linux 實作并沒有區分這兩個概念(程序和線程)
1. 程序:程式的一次執行
2. 線程:CPU的基本排程機關
一個程序可以包含多個線程。
http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
多線程
多線程的幾種實作方式,什麼是線程安全。
實作runable接口,繼承thread類。
http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-answers/
volatile 的原理,作用,能代替鎖麼。
Volatile利用記憶體栅欄機制來保持變量的一緻性。不能代替鎖,其隻具備資料可見性一緻性,不具備原子性。
http://blog.csdn.net/gongzi2311/article/details/20715185
畫一個線程的生命周期狀态圖。
建立,可運作,運作中, 睡眠,阻塞,等待,死亡。
http://ifeve.com/thread-status
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 的原理是什麼,解釋以下名詞:重排序,自旋鎖,偏向鎖,輕量級鎖,可重入鎖,公平鎖,非公平鎖,樂觀鎖,悲觀鎖。
Synchronized底層是通過螢幕的enter和exit實作
https://my.oschina.net/cnarthurs/blog/847801
http://blog.csdn.net/a314773862/article/details/54095819
用過哪些原子類,他們的原理是什麼。
AtomicInteger; AtomicLong; AtomicReference; AtomicBoolean;基于CAS原語實作 ,比較并交換、加載連結/條件存儲,最壞的情況下是旋轉鎖
https://www.ibm.com/developerworks/cn/java/j-jtp11234/index.html
http://www.jmatrix.org/java/848.html
用過線程池嗎,newCache 和 newFixed 有什麼差別,他們的原理簡單概括下,構造函數的各個參數的含義是什麼,比如 coreSize,maxsize 等。
newSingleThreadExecutor傳回以個包含單線程的Executor,将多個任務交給此Exector時,這個線程處理完一個任務後接着處理下一個任務,若該線程出現異常,将會有一個新的線程來替代。
newFixedThreadPool傳回一個包含指定數目線程的線程池,如果任務數量多于線程數目,那麼沒有沒有執行的任務必須等待,直到有任務完成為止。
newCachedThreadPool根據使用者的任務數建立相應的線程來處理,該線程池不會對線程數目加以限制,完全依賴于JVM能建立線程的數量,可能引起記憶體不足。
底層是基于ThreadPoolExecutor實作,借助reentrantlock保證并發。
coreSize核心線程數,maxsize最大線程數。
http://ifeve.com/java-threadpoolexecutor/
線程池的關閉方式有幾種,各自的差別是什麼。
Shutdown shutdownNow tryTerminate 清空工作隊列,終止線程池中各個線程,銷毀線程池
http://blog.csdn.net/xxcupid/article/details/51993235
假如有一個第三方接口,有很多個線程去調用擷取資料,現在規定每秒鐘最多有 10 個線程同時調用它,如何做到。
ScheduledThreadPoolExecutor 設定定時,進行排程。
public ScheduledThreadPoolExecutor(int corePoolSize,
ThreadFactory threadFactory) {
super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS,
new DelayedWorkQueue(), threadFactory);
}
http://ifeve.com/java-scheduledthreadpoolexecutor/
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/
如果讓你實作一個并發安全的連結清單,你會怎麼做。
Collections.synchronizedList() ConcurrentLinkedQueue
http://blog.csdn.net/xingjiarong/article/details/48046751
有哪些無鎖資料結構,他們實作的原理是什麼。
LockFree,CAS
基于jdk提供的原子類原語實作,例如AtomicReference
http://blog.csdn.net/b_h_l/article/details/8704480
講講 java 同步機制的 wait 和 notify。
首先這兩個方法隻能在同步代碼塊中調用,wait會釋放掉對象鎖,等待notify喚醒。
http://blog.csdn.net/ithomer/article/details/7685594
多線程如果線程挂住了怎麼辦。
根據具體情況(sleep,wait,join等),酌情選擇notifyAll,notify進行線程喚醒。
http://blog.chinaunix.net/uid-122937-id-215913.html
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 修飾靜态方法和非靜态方法有什麼差別。
對象鎖和類鎖
https://yq.aliyun.com/articles/24226
簡述 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