1. 程式人生 > >Java多線程基礎總結

Java多線程基礎總結

current 安全性 讓其 vector ren AS get 隊列 內存模型

一、線程和進程關系

二、創建方式
1.繼承Thread類,重寫run方法
2.實現Runable接口,重寫run方法
3.使用匿名內部類

三、API接口
start()
currentThread() 獲取當前線程對象
getID() 獲取當前線程ID Thread-編號 該編號從0開始
getName() 獲取當前線程名稱
sleep() 休眠線程
stop() 停止線程

四、實例化線程
Thread() 分配一個新的 Thread 對象
Thread(String name) 分配一個新的 Thread對象,具有指定的 name正如其名
Thread(Runable r) 分配一個新的 Thread對象
Thread(Runable r, String name) 分配一個新的 Thread對象

五、守護進程
用戶線程,不會隨主線程停止而停止
守護線程,隨主線程停止也停止,setDaemon(true),設置守護線程
gc線程屬於守護線程

六、多線程運行狀態

新建狀態 Thread thread = new Thread()
就緒狀態,等待CPU調度 thread.start()
運行狀態 thread.run()
阻塞狀態 thread.sleep()
死亡狀態 thread.stop()

七、join()方法
join()的作用是讓其他的線程變為等待,直到當前線程執行完畢。

八、線程安全問題
多個線程同時共享,同一個全局變量或靜態變量,做寫操作,可能會發生數據沖突問題。

九、線程安全解決辦法
synchronized或使用lock鎖

1. 同步代碼塊,可以是任意對象
synchronized(同一個數據){
可能會發生線程沖突問題
}
2. 同步函數,使用this鎖。
3. 靜態同步函數,使用字節碼文件鎖。

九、死鎖問題
嵌套同步,導致鎖無法釋放

十、多線程三大特性
原子性、可見性、有序性。

十一、Java內存模型(JMM)
線程之間的共享變量存儲在主內存,每個線程都有一個私有的內地內存,本地內存中存儲了該線程以讀/寫共享變量的副本。本地內存只是一個概念,涵蓋了緩存,寫緩沖區,寄存器以及其他的硬件和編輯器優化。

十二、Volatile
Volatile關鍵字解決了線程之間的可見性問題。Volatile強制線程每次讀取值都從主內存“取值”。

十三、AtomicInteger原子類
可以通過線程安全的方式操作加減。

十四、volatile與synchronized區別
僅靠volatile不能保證線程的安全性。(原子性)
①volatile輕量級,只能修飾變量。synchronized重量級,還可修飾方法
②volatile只能保證數據的可見性,不能用來同步,因為多個線程並發訪問volatile修飾的變量不會阻塞。
synchronized不僅保證可見性,而且還保證原子性,因為,只有獲得了鎖的線程才能進入臨界區,從而保證臨界區中的所有語句都全部執行。多個線程爭搶synchronized鎖對象時,會出現阻塞。
線程安全性
線程安全性包括兩個方面,①可見性。②原子性。
僅僅使用volatile並不能保證線程安全性。而synchronized則可實現線程的安全性。

十五、線程間通訊,wait()和notify(),notifyAll()
屬於Object方法
wait()可以讓當前類鎖住的線程從運行狀態變為休眠狀態,釋放鎖的資源。
notify()可以讓當前類鎖住的線程從休眠狀態變為運行狀態。

一般在線程同步中,同一個鎖資源使用。

十六、Lock鎖(jdk1.5並發包)
Lock lock = new ReentrantLock();
try{
lock.lock();
lock.unlock();
}catch(){
}

十七、Condition實現和wait()、notify()一樣的功能
await();同wait()
signal();同notify()

十八、怎麽停止線程
不建議使用stop(),
1、設計while,變量判斷退出循環。
2、interrupt()讓線程拋出異常。

十九、ThreadLock
為每一個線程提供一個局部變量。
底層實現
Map.put(Thread.currentThread(), Object);

二十、Java並發包
原子類、Lock、並發類

二十一、Vector和ArrayList
實現原理都是通過數組實現,查詢速度快,增加、修改、刪除速度慢。區別
Vector是線程安全的,ArrayList是線程不安全的。

二十二、HasTable和HasMap
實現原理都是通過鏈表+數組
HasTable是線程安全的,HasMap是線程不安全的。

二十三、Collection.synchroniedMap()
把非安全的Map集合轉為安全的Map。(代理模式)

二十四、ConcurrenHasMap
分段鎖,將一個整體拆分成多個小的HasTable,默認分16段。

二十五、CountDownLatch
計數器,可以限制執行順序。
CountDownLatch countDownLatch = new CountDownLatch(2);
countDownLatch.countDown();每次減1
countDownLatch.countDown();
countDownLatch.await(); 不為0時一直等待

二十六、CyclicBarrier
計數器,當線程數達到一定的數量,並發執行。
CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
cyclicBarrier.await; 等待線程達到5個,一起並發執行

二十七、Semaphore
計數器
Semaphore semaphore = new Semaphore(5); 最大資源數
semaphore.availablePermits(); 判斷資源
semaphore.acquire(); 獲取資源
semaphore.release(); 釋放資源

二十八、並發隊列
有界和無界
阻塞隊列和非阻塞隊列
ConcurrentLinkedDeque,無界非阻塞隊列
BlockingQueue,有界阻塞隊列

轉載請註明出處。
作者:wuxiwei
出處:http://www.cnblogs.com/wxw16/p/8915834.html

Java多線程基礎總結