JAVA多線程/併發——問題與答案(1)

多線程

java中有幾種方法可以實現一個線程?

JAVA多線程實現方式主要有三種:繼承Thread類、實現Runnable接口、使用ExecutorService、Callable、Future實現有返回結果的多線程。其中前兩種方式線程執行完後都沒有返回值,只有最後一種是帶返回值的。ExecutoreService提供了submit()方法,傳遞一個Callable,或Runnable,返回Future。如果Executor後臺線程池還沒有完成Callable的計算,這調用返回Future對象的get()方法,會阻塞直到計算完成。

 參考地址:http://blog.csdn.net/aboy123/article/details/38307539

如何停止一個正在運行的線程?

1、使用退出標誌,使線程正常退出,也就是當run方法完成後線程終止。(設一個boolean類型的標誌)
2、使用interrupt方法中斷線程,interrupt()方法的使用效果並不像for+break語句那樣,馬上就停止循環。調用interrupt方法是在當前線程中打了一個停止標誌,並不是真的停止線程。
3、拋出異常,catch到拋出的異常,也能停止線程
4、使用return停止線程,將方法interrupt()與return結合使用也能實現停止線程的效果  

參考博文:https://www.cnblogs.com/greta/p/5624839.html

notify()和notifyAll()有什麼區別?

 如果線程調用了對象的 wait()方法,那麼線程便會處於該對象的等待池中,等待池中的線程不會去競爭該對象的鎖。

 notify()方法,在等待池中 隨機喚醒一個等待線程。notifyAll()是喚醒等待池中的所有線程,讓他們   去競爭鎖,得到鎖的線程繼續運行,未得到鎖的線程,繼續處於等待狀態。

sleep()和 wait()有什麼區別?

  1,這兩個方法來自不同的類分別是Thread和Object
  2,最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。
  3,wait,notify和notifyAll只能在同步控制方法或者同步控制塊裏面使用,而sleep可以在
    任何地方使用
   synchronized(x){
      x.notify()
     //或者wait()
   }
   4,sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常  

參考文章:https://www.cnblogs.com/lancidie/archive/2011/01/24/1943401.html       

什麼是Daemon線程?它有什麼意義?

任何一個守護線程都是整個JVM中所有非守護線程的,只要當前JVM實例中尚存在任何一個非守護線程沒有結束,守護線程就全部工作;只有當最後一個非守護線程結束時,守護線程隨着JVM一同結束工作。
Daemon的作用是爲其他線程的運行提供便利服務,守護線程最典型的應用就是 GC (垃圾回收器),它就是一守護線程。

 參考:http://blog.csdn.net/u010739551/article/details/51065923

java如何實現多線程之間的通訊和協作?

1,共享內存,兩個線程共同持有一個對象鎖

2,wait()/notify()/join()等方法

3,管道通信就是使用java.io.PipedInputStream 和 java.io.PipedOutputStream進行通信

4,Conditon的await()/signal()

參考:http://blog.csdn.net/justloveyou_/article/details/54929949

什麼是可重入鎖(ReentrantLock)?   

鎖的概念就不用多解釋了,當某個線程A已經持有了一個鎖,當線程B嘗試進入被這個鎖保護的代碼段的時候.就會被阻塞.而鎖的操作粒度是”線程”,而不是調用(至於爲什麼要這樣,下面解釋).同一個線程再次進入同步代碼的時候.可以使用自己已經獲取到的鎖,這就是可重入鎖java裏面內置鎖(synchronize)和Lock(ReentrantLock)都是可重入的

 參考:http://blog.csdn.net/johnking123/article/details/50043961

當一個線程進入某個對象的一個synchronized的實例方法後,其它線程是否可進入此對象的其它方法? 

分幾種情況:
     1.其他方法前是否加了synchronized關鍵字,如果沒加,則能。
     2.如果這個方法內部調用了wait,則可以進入其他synchronized方法。
     3.如果其他個方法都加了synchronized關鍵字,並且內部沒有調用wait,則不能。
     4.如果其他方法是static,它用的同步鎖是當前類的字節碼,與非靜態的方法不能同步,因爲非靜態的方法用的是this。

參考:http://blog.csdn.net/bornlili/article/details/55803965  

synchronized和java.util.concurrent.locks.Lock的異同?

簡要答案:
   1.Lock能完成幾乎所有synchronized的功能,並有一些後者不具備的功能,如鎖投票、定時鎖等候、可中斷鎖等候等
   2.synchronized 是Java 語言層面的,是內置的關鍵字;Lock 則是JDK 5中出現的一個包,在使用時,synchronized 同步的代碼塊可以由JVM自動釋放;Lock 需要程序員在finally塊中手工釋放,如果不釋放,可能會引起難以預料的後果(在多線程環境中)。

參考:http://blog.csdn.net/hintcnuie/article/details/11022049

樂觀鎖和悲觀鎖的理解及如何實現,有哪些實現方式?

悲觀鎖:總是假設最壞的情況,每次去拿數據的時候都認爲別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻塞直到它拿到鎖。傳統的關係型數據庫裏邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。再比如Java裏面的同步原語synchronized關鍵字的實現也是悲觀鎖

樂觀鎖:顧名思義,就是很樂觀,每次去拿數據的時候都認爲別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可以使用版本號等機制。樂觀鎖適用於多讀的應用類型,這樣可以提高吞吐量,像數據庫提供的類似於write_condition機制,其實都是提供的樂觀鎖。在Java中java.util.concurrent.atomic包下面的原子變量類就是使用了樂觀鎖的一種實現方式CAS實現的

併發框架

SynchronizedMap和ConcurrentHashMap有什麼區別?

SynchronizedMap類是定義在Collections中的一個靜態內部類。它實現了Map接口,並對其中的每一個方法實現,通過synchronized關鍵字進行了同步控制。

ConcurrentHashMap是java併發包下的一個併發集合框架,其用分段鎖的方法保證線程安全。

參考:https://www.cnblogs.com/grefr/p/6094888.html

CopyOnWriteArrayList可以用於什麼應用場景?

參考:http://blog.csdn.net/linsongbin1/article/details/54581787

發佈了34 篇原創文章 · 獲贊 22 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章