天天看點

java線程小知識

1,鎖

     synchronized,wait,notify,nofifyAll其實都是對鎖的操作。synchronized一個對象,一個代碼區,一個方法,其實都是擷取該對象的鎖,一個對象隻有為一個的一個鎖,代碼區,和方法鎖,其實擷取的是該對象的鎖。如

   public synchronized void test()

  {

  }

  執行該方法之前申請該對象的鎖。

 2,Thread和Runable 

  thread 和 Runnable 的相同點:都是“多線程的實作方式”。

  Thread 和 Runnable 的不同點:

  Thread 是類,而Runnable是接口;Thread本身是實作了Runnable接口的類。我們知道“一個類隻能有一個父類,但是卻能實作多個接口”,是以Runnable具有更好的擴充性。

3,synchronized基本規則

  第一條: 當一個線程通路“某對象”的“synchronized方法”或者“synchronized代碼塊”時,其他線程對“該對象”的該“synchronized方法”或者“synchronized代碼塊”的通路将被阻塞。

  第二條: 當一個線程通路“某對象”的“synchronized方法”或者“synchronized代碼塊”時,其他線程仍然可以通路“該對象”的非同步代碼塊。

  第三條: 當一個線程通路“某對象”的“synchronized方法”或者“synchronized代碼塊”時,其他線程對“該對象”的其他的“synchronized方法”或者“synchronized代碼塊”的通路将被阻塞。

4,notify,notifyAll

  使用notify或notifyAll後,隻是喚醒了其它該鎖的wait線程,使他們擁有擷取鎖的權利,此時他們還是阻塞的,必須等待擷取鎖才能回到運作狀态,wait是由持有鎖的對象調用,如果該對象不持有鎖,調用則會報錯

5,interrupt

  該調用該操作時,首先會檢查權限,沒有會抛異常,如果有,做的操作是将線程的中斷标記設定為True,并不會中斷線程。如果該線程處于阻塞狀态,則會抛出異常

  記住該操作知識做标記,并不會中斷線程

  

下面是jdk描述

  本線程中斷自己是被允許的;其它線程調用本線程的interrupt()方法時,會通過checkAccess()檢查權限。這有可能抛出SecurityException異常。如果本線程是處于阻塞狀态:調用線程的wait(), wait(long)或

wait(long, int)會讓它進入等待(阻塞)狀态,或者調用線程的join(), join(long), join(long, int), sleep(long), sleep(long, int)也會讓它進入阻塞狀态。若線程在阻塞狀态時,調用了它的interrupt()方法,那麼它

的“中斷狀态”會被清除并且會收到一個InterruptedException異常。例如,線程通過wait()進入阻塞狀态,此時通過interrupt()中斷該線程調用interrupt()會立即将線程的中斷标記設為“true”,但是由于線程處于阻

塞狀态,是以該“中斷标記”會立即被清除為“false”,同時,會産生一個InterruptedException的異常如果線程被阻塞在一個Selector選擇器中,那麼通過interrupt()中斷它時;線程的中斷标記會被設定為true,并且

它會立即從選擇操作中傳回。如果不屬于前面所說的情況,那麼通過interrupt()中斷線程時,它的中斷标記會被設定為“true”。中斷一個“已終止的線程”不會産生任何操作。

6,java.lang.IllegalMonitorStateException分析

   1,目前線程不含有目前對象的鎖資源的時候,調用obj.wait()方法;

        2,目前線程不含有目前對象的鎖資源的時候,調用obj.notify()方法。

        3,目前線程不含有目前對象的鎖資源的時候,調用obj.notifyAll()方法

 7,wait,notify與condition的await,signal

   notify與notifyAll喚醒不能指定線程,不能很好控制各個線程的等待與喚醒。而condition的await,signal操作可以對不同的需求對該鎖建立不同的condition,進而對各個線程精确控制。

8,wait,notify與LockSupport的park,unpark

  wait,notify的使用者必須是擷取sychronized同步鎖的對象,沒擷取就不能使用,而LockSupport可以對其它線程進行鎖定和喚醒。

9,FairSyn,NoFairSyn

  主要不同在于擷取鎖的時候,當鎖狀态為0時,NoFairSyn是搶占式的,而FairSyn則需要判斷等帶隊列是否為空

轉載于:https://www.cnblogs.com/2015zzh/p/4972966.html