Java 多線程編程核心技術 筆記

外練互斥,內修可見。java

1:currentThread() 方法可返回代碼正在被哪一個線程調用的信息
    使用方法:Thread.currentThread.getName()
    
2:isAlive()  功能是判斷當前線程是否處於活動狀態
    使用方法:Thread.currentThread.isAlive()安全

3:sleep() 做用是在指定的毫秒數內讓當前「正在執行的線程」休眠(暫停執行),sleep 會讓出cpu執行時間片,sleep不釋放鎖。
    使用方法:Thread.sleep(2000)多線程

4:getId()方法的做用是取得線程的惟一標識
    使用方法:Thread.currentThread.getId();函數

5:中止線程,在java中有三種方法能夠終止正在運行的線程
    5-1:使用退出標誌,使線程正常退出,也就是當run方法執行完成後線程終止。
    5-2:使用stop方法強行終止線程,可是不推薦這個方法,由於stop和suspend以及resume同樣,都是過時做廢的方法,使用它們會致使線程不安全。
    5-3:使用interrupt方法中斷線程性能

6:interrupted() 測試當前線程是否已經中斷,執行後具備將狀態標誌清除爲flase的功能
    使用方法;thread.interrupted()  ps:返回boolean類型,此時將返回true,表明中斷成功。測試

7:isInterrupted() 測試線程Thread對象是否已是中斷狀態,但不清除狀態標誌。
    使用方法:thread.isInterrupted() ps:返回true,表明線程已經中止。
    
8:yield() 方法的做用是放棄當前的cpu資源,讓給其餘的任務去佔用cpu的執行時間,可是放棄的時間不肯定,有可能剛剛放棄,立刻又得到cpu時間片,這多是因爲自身線程的優先級較高。
    使用方法:Thread.yield()
    
9:線程優先級
    設置線程優先級使用方法:Thread.currentThread.setPriority(6)
    
    線程優先級具備繼承性:好比A線程啓動了B線程,那麼B線程的優先級和A線程的優先級同樣。
    線程優先級具備規則性:高優先級的線程老是大部分先執行完,但不表明高優先級的線程要所有先執行完。並且當優先級的差距很大時,誰先執行完和代碼的調用順序無關。
    線程優先級具備隨機性:線程的優先級具備隨機性,優先級搞得線程不必定每一次都先執行完。線程

10:守護線程
    在java線程中,有兩種線程一種是守護線程,另外一種是用戶線程也就是非守護線程。
    守護線程是一種特殊的線程,它的特性有陪伴的含義,當進程中不存在非守護線程時,守護線程自動銷燬。
    java中典型的守護線程就是垃圾回收線程(GC),當進程中沒有非守護線程時,垃圾回收線程也沒有存在的必要了,自動銷燬。
    使用方法:thread.setDaemon(true)
·
11:synchronized 取得的鎖都是對象鎖,而不是把一段代碼或方法當作鎖,哪一個線程先執行帶synchronized關鍵字的方法,
    哪一個線程就持有該方法所屬對象的Lock,那麼其餘線程只能呈等待狀態,可是此時其餘線程能夠訪問被鎖對象的非同步方法,
    前提是多個線程訪問的是同一個對象。若是多個線程訪問不一樣的對象,那麼JVM就會建立多個鎖。對象

12:synchronized 可重入鎖說明:
    可重入鎖的概念是:本身能夠再次獲取本身的內部鎖,好比有一個線程得到了某個對象的鎖,此時這個線程尚未釋放這個對象的鎖,那麼它再次想要獲取這個對象的鎖仍是能夠獲取到的。
    若是是不可重入鎖的話,就會形成死鎖。繼承

13:當一個線程出現異常時,鎖會自動釋放。其餘線程就能夠獲取到鎖,繼續執行。隊列

14:synchronized 不具備繼承性,也就是說父類的方式是synchronized聲明的,子類繼承並實現該方法是不帶同步功能的,因此要想實現父類的同步功能,在子類中的方法中也要加上 synchronized 關鍵字。

15:當使用synchronized時,最好不要同步整個方法,由於同步整個方法效率過低,最好是同步代碼塊,在真正須要同步的代碼塊上加入synchronized關鍵字

16:synchronized 應用在static靜態方法上時,是對當前的java文件對應class類進行加鎖,此時多個線程訪問多個相同對象的靜態方法 也是須要排隊獲取class類的鎖的。

17:synchronized 不要使用String做爲鎖對象,由於String 常量池的影響
    例如:
    public static void main(String args[]){
        String a="AA";
        String b="AA";
        System.out.println(a==b);
    }
    結果是輸出 true,由於AA是在常量池中,因此變量a和變量b指向的都是常量池中的AA。
    因此當使用synchronized鎖住String對象時,會形成線程持有相同的鎖,致使只有一個線程一直在運行,其餘線程一直獲取不到鎖。

18:synchronized 包含兩個特性:互斥性和可見性。
    
19:volatile 關鍵字增長了實例變量在多個線程之間的可見性,但volatile不支持原子性
    volatile和synchronized區別
        1:關鍵字volatile是線程同步的輕量級實現,因此vloatile性能要比synchronized好,而且volatile只修飾變量,而synchronized能夠修飾方法 以及代碼塊。
        2:多線程訪問volatile不會發生阻塞,而sunchronized會阻塞
        3:volatile能保證數據的可見性,但不能保證原子性,而sunchronized能夠保證原子性,也能夠間接的保證可見性,由於它會將私有內存和公共內存的數據作同步。
        
20:使用原子類進行i++操做,例如AtomicInteger
    使用方法:
        private AtomicInteger count=new AtomicInteger(0);
        public  void add(String args[]){
            for(int i=0;i<100;i++){
                count.incrementAndGet();
            }
        }
21:原子類也不能保證線程必定安全,使用原子類修飾的變量能夠保證原子性,可是方法和方法之間的調用,不是原子的,頗有可能調用順序出錯。
    因此應該在方法上加入synchronized關鍵字配合原子類。
    
22:wait()方法的做用是使當前執行代碼的線程進行等待,wait()方法是Object類的方法,該方法用來將當前線程放到「預執行隊列」中,
    wait()方法在調用前,須要獲取該對象的對象級別鎖,因此它必須在同步方法或者同步代碼塊中調用。
    
23:notify()方法的做用是釋放該對象的鎖並通知那些呈wait狀態的其餘線程,對其發出通知,此時線程規劃器會隨機挑選一個wait的線程,並使它等待獲取該對象的對象鎖。
   再調用notify()後,並不會當即執行,wait()方法的下面代碼。
    而是須要等到執行notify方法的同步代碼塊中的代碼所有執行完之後釋放了該對象的鎖,此時才能執行wait()方法下面的代碼。

24:用一句話總結wait和notify:wait是線程中止運行,並釋放鎖。而notify會隨機使一箇中止的線程繼續運行。

25:notifyAll()方法喚醒 同一共享資源的「所有」線程,使其從等待狀態退出,進入到可運行狀態。根據不一樣虛擬機的實現,有多是優先級最高的那個線程先獲取到鎖先執行,也有多是隨機執行。

26:wait(long) 方法 是等待某一時間內是否有線程對鎖進行喚醒,若是超過這個時間則自動喚醒。

27:join()方法做用是 使線程按照給定的順序運行。 join具備使線程排隊的做用,有些相似同步的運行效果,
    join與synchronized的區別是:join內部使用wait()方法進行等待,而synchronized關鍵字則使用「對象監視器」原理做爲同步。
    例如:
        public static void main(String args[]){
            MyThread threadTest=new MyThread();
            threadTest.start();
            threadTest.join();
            System.out.println("threadTest 線程運行完後,我纔會打印這句話");
        }

28:Threadlocal 第一次調用get()時值爲null的解決辦法, 新建一個類,繼承ThreadLocal 並實現initialValue()方法,返回默認值。

29:當使用ThreadLocal時,要在子線程中獲取父線程使用的ThreadLocal的值時,須要使用InheritableThreadLocal這個類
    InheritableThreadLocal 和 ThreadLocal 最大的區別就是: 使用ThreadLocal修飾的變量,子類不能繼承父類的變量值。 而使用InheritableThreadLocal 能夠。
    當子類須要改變被InheritableThreadLocal修飾的變量值時,只須要重寫childValue()方法。
    
    須要注意的是 使用InheritableThreadLocal時,若是子線程在取得值得同時,主線程將InheritableThreadLocal中的值進行更改,那麼子線程取到的值仍是舊值。

30: ReentrantLock lock()加鎖 unlock()釋放鎖  相似於Synchronized關鍵字。不過ReetrantLock的功能和效率要比Synchronized強大

31:Condition  對象監視器,主要是配合ReetrantLock 實現ReetrantLock 的喚醒和等待。  Condition condition=new ReetrantLock.newCondtion();
    condition.await() 等待  至關於Object類中的 wait()
    condition.signal()  隨機喚醒一個await狀態的線程   至關於Object類中的 notify()
    condition.signalAll() 喚醒所有    至關於Object類中的notifyAll()
32:ReentrantLock 能夠設置公平鎖或是非公平鎖
                公平鎖指的是:線程獲取鎖的順序是按照線程加鎖的順序來分配的,即先進先出FIFO的順序。性能不如非公平鎖。
                非公平鎖就是一種獲取鎖的搶佔機制,隨機獲取鎖,可能優先級高的獲取鎖的概率會大一些。這樣有的線程可能一直獲取不到鎖,結果也就是不公平了。
                ReetrantLock reetrantLock=new ReetrantLock(true); ReetrantLock的構造函數中,傳入true就是公平鎖,不傳默認爲非公平鎖

33:ReentrantLock的  getHoldCount()方法的做用是 查詢當前線程保持此鎖定的個數,也就是調用lock()方法的次數。

34:ReentrantLock的  getQueueLength() 方法的做用是 返回正在等待獲取鎖的線程估計數,

35:ReentrantLock的  getWaitQueueLength() 方法的做用是返回執行同一個condition(對象監視器)的await()方法的估計數。 好比有5個線程調用了同一個ReetrantLock對象的await()方法,那麼getWaitQueueLength()返回5

36:ReentrantLock的  hasQueuedThread(Thead thread) 方法做用是 查詢指定的線程是否正在等待獲取鎖
   ReentrantLock的  hasQueuedThreads() 方法的做用是 查詢是否有線程正在等待獲取鎖

37:ReentrantLock的  hasWaiters(Condition condition) 的做用是查詢是否有線程正在等待與此鎖定有關的condition條件。

38:ReentrantLock的  isFair() 的做用是判斷是否是公平鎖

39:ReentrantLock的  isHeldByCurrentThread() 的做用是 查詢當前線程是否保持此鎖定

40:ReentrantLock的  lockInterruptibly 的做用是 若是當前線程未被中斷,則獲取鎖定,若是已經被中斷則出現異常。

41:ReentrantLock的  tryLock() 僅在調用時 當前的鎖未被另外一個線程保持的狀況下,纔會獲取該鎖定。

41:ReentrantLock的  tryLock(long timeout,TimeUnit unit) 的做用時,若是鎖定在給定等待時間內沒有被另外一個線程保持,且當前線程未被中斷,則獲取該鎖定。

42:讀寫鎖  ReentrantReadWriteLock 類     讀寫鎖表示有兩個鎖,一個是讀操做相關的鎖 共享鎖 ,一個是寫操做相關的鎖 排他鎖, 多個讀鎖之間不互斥,讀鎖與寫鎖互斥,寫鎖與寫鎖互斥。     ReentrantReadWriteLock lock =new ReentrantReadWriteLock();     lock.readLock.lock(); 獲取讀鎖     lock.writeLock.lock(); 獲取寫鎖

相關文章
相關標籤/搜索