java中級面試題1
1、threadlocal問題
https://blog.csdn.net/tiwerbao/article/details/50827305
ThreadLocal原始碼可以看出:
1) ThreadLocal賦初始值的時候,需要線上程執行中,即run()中,不能作為thread的屬性,否則ThreadLocalMap會掛錯執行緒;
2) 使用ThreadLocal隔離的值不能是引用,否則隔離的只是引用,而引用所指向的物件則隔離失敗;
3) 本地資料區ThreadLocalMap是掛在Thread物件上的,所以要注意執行緒複用(執行緒池)所帶來的汙染。
2、
https://blog.csdn.net/h12kjgj/article/details/55063956springMVC中,一般Controller、service、DAO層的scope均是singleton;
每個請求都是單獨的執行緒,即使同時訪問同一個Controller物件,因為並沒有修改Controller物件,相當於針對Controller物件而言,只是讀操作,沒有寫操作,不需要做同步處理。
由於只有一個Controller的instance,當多個執行緒同時呼叫它的時候,它裡面的instance變數就不是執行緒安全的了,會發生竄資料的問題。,因此,我們在使用spring mvc 的contrller時,應避免在controller中定義例項變數。
而tomcat可以選擇但是不是每次收到請求就開一個新的執行緒,而是使用執行緒池,執行緒池的執行緒數量通常有限制的,如果所有執行緒都被阻塞(例如網速慢,或者被人惡意佔用連線),那麼接下來的請求將會排隊等待。或者 使用nio 收到一個請求就新開一個執行緒去處理任務,主執行緒返回,繼續處理下一個任務,這種為非阻塞.
Tomcat執行可以選擇BIO或者NIO模型,原理分別對應上面的3和4兩種方式。Tomcat預設是BIO方式執行,如果想要換成NIO,可以配置server.xml:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" .../>
從效能上考慮建議使用NIO。
Tomcat執行緒池每次從佇列頭部取執行緒去處理請求,請求完結束後再放到佇列尾部,也就是說前後兩次請求處理不會用同一個執行緒。某個執行緒閒置超過maxIdleTime就釋放掉。
真正決定Tomcat最大可能達到的執行緒數是maxConnections這個引數和併發數,當併發數超過這個引數則請求會排隊,這時響應的快慢就看你的程式效能了。
3、
.CountDownLatch用法
CountDownLatch類位於java.util.concurrent包下,利用它可以實現類似計數器的功能。比如有一個任務A,它要等待其他4個任務執行完畢之後才能執行,此時就可以利用CountDownLatch來實現這種功能了。
CountDownLatch類只提供了一個構造器:
1 | public CountDownLatch( int count) { }; //引數count為計數值 |
然後下面這3個方法是CountDownLatch類中最重要的方法:
123 | public void await() throws InterruptedException { }; //呼叫await()方法的執行緒會被掛起,它會等待直到count值為0才繼續執行 public boolean await( long timeout, TimeUnit unit) throws InterruptedException { }; //和await()類似,只不過等待一定的時間後count值還沒變為0的話就會繼續執行 public void countDown() { }; //將count值減1 |
CyclicBarrier用法
字面意思迴環柵欄,通過它可以實現讓一組執行緒等待至某個狀態之後再全部同時執行。叫做迴環是因為當所有等待執行緒都被釋放以後,CyclicBarrier可以被重用。我們暫且把這個狀態就叫做barrier,當呼叫await()方法之後,執行緒就處於barrier了。
CyclicBarrier類位於java.util.concurrent包下,CyclicBarrier提供2個構造器:
12345 | public CyclicBarrier( int parties, Runnable barrierAction) { } public CyclicBarrier( int parties) { } |
引數parties指讓多少個執行緒或者任務等待至barrier狀態;引數barrierAction為當這些執行緒都達到barrier狀態時會執行的內容。
CountDownLatch一般用於某個執行緒A等待若干個其他執行緒執行完任務之後,它才執行;
而CyclicBarrier一般用於一組執行緒互相等待至某個狀態,然後這一組執行緒再同時執行;
另外,CountDownLatch是不能夠重用的,而CyclicBarrier是可以重用的。
4\CopyOnWriteArrayList問到最大容量,一時懵逼,畢竟沒人問過,看了下原始碼應該是int
5\線上伺服器排查
https://blog.csdn.net/and1kaney/article/details/51214219
總結,需要認真對待每次面試,做好充分的準備才行