1. 程式人生 > >java中級面試題1

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類只提供了一個構造器:

1public CountDownLatch(int count) {  };  //引數count為計數值

然後下面這3個方法是CountDownLatch類中最重要的方法:

123public 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個構造器:

12345public 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

總結,需要認真對待每次面試,做好充分的準備才行