外練互斥,內修可見。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(); 獲取寫鎖