java多線程2

  1. 「非線程安全」問題存在於「實例變量」中,若是是方法內部的私有變量,則不存在線程安全問題。這是由於方法內部的變量都是私有形成的。java

  2. synchronized 獲取的都是對象鎖。若是多個線程訪問多個對象,則JVM會建立多個鎖。安全

  3. A線程持有object 對象的的Lock鎖,B線程能夠異步調用A線程非同步方法。A線程持有object 對象的的Lock鎖,B線程若是在這個時調用object對象中的synchronized類型的方法則須要等待。多線程

  4. synchronized擁有鎖重入的功能。當一個線程獲得一個對象鎖後,再次請求對象鎖時是能夠再次獲得該對象的鎖。異步

  5. 可重入鎖支持在父子類繼承的環境中。工具

  6. 當一個線程出現異常,其持有的鎖自動釋放。this

  7. 同步不具備繼承。線程

  8. synchronized(非this對象)同步代碼塊格式時,持有不一樣的對象監視器是異步的效果。對象

  9. synchronized還能夠做用在static靜態方法上,那是對*.java文件對應的Class類進行加鎖。繼承

  10. 使用JDK自帶工具查看線程是否死鎖:進入JDK安裝目錄,bin目錄下,執行jps命令。再執行jstack -l xxx 。內存

  11. volatile 是變量在多個線程可見。強制從公共堆棧中取得變量的值,而不是從線程私有數據棧中取得變量的值。

  12. volatile不支持原子性。

  13. volatile vs sysnchronized:

    • volatile 是非線程安全的,而 sysnchronized 是線程安全的。
    • volatile 只能做用於變量,而 sysnchronized 能夠做用於方法,代碼塊。
    • 多線程訪問 volatile不會發生阻塞,而sysnchronized會發生阻塞。
  14. 變量在內存中的過程:

    • read和load階段:從主內存複製變量到當前線程工做內存。
    • use和write階段:執行代碼,改變共享變量的值。
    • store和write階段: 用工做內存數據刷新主內存對應的變量。
  15. 執行完同步代碼就會釋放對象的鎖;在執行同步代碼的過程當中,遇到異常而致使線程終止,鎖也會被釋放;在執行同步代碼的過程當中,執行了鎖對象所屬的wait()方法,這個線程會釋放鎖對象,而此線程對象會進入線程等待池中等待喚醒。

  16. join()的做用是等待線程對象銷燬。在內部使用wait()方法進行等待。

  17. join(long) vs sleep:前者在指定時間後會釋放鎖,然後者不會。

  18. ThreadLocal 解決的是變量在不一樣線程之間的隔離性。

  19. InheritableThreadLocal 能夠在子線程中取得父線程繼承下來的值。

  20. Lock.getHoldCount()方法能夠查詢當前線程保持此鎖定的個數,即調用lock方法的次數;getQueueLength()返回正等待獲取此鎖定的線程估計數;getWaitQueueLength(Condition condition)返回等待與此鎖定相關的給定條件condition的線程估計數。

  21. 其餘方法:

    • hasQueuedThread(Thread thread):查詢指定線程是否正在等待獲取此鎖定;
    • hasQueuedThreads():查詢是否有線程正在等待獲取此鎖定;
    • hasWaiters(Condition condition)的做用是查詢是否有線程正在等待與此鎖定有關的condition條件。
  22. condition.awaitUntil(xxx):設置線程特定時間後自動喚醒。在等待中,能夠被其餘線程提早喚醒。

  23. ReentrantReadWriteLock:多個線程可讀,一個線程寫。該鎖維護2個鎖,一個讀鎖,也稱爲共享鎖,一個寫入鎖,也稱爲拍他鎖。多個讀鎖之間不互斥,讀鎖寫鎖互斥,寫鎖與寫鎖互斥。

相關文章
相關標籤/搜索