一、並行世界
摩爾定律的失效,2004年秋季,Intel宣布徹底取消4GHz計划,CPU向多核心的發展,頂級計算機科學家唐納德丶爾文丶克努斯評價:在我看來,這種現象(並發)或多或少是由於硬件設計者已經無計可施導致的,他們將摩爾定律失效的責任推脫給軟件開發者。
1、幾個概念
同步和異步:
並發與並行:都表示多個任務同時執行,但並發偏重於多個任務交替執行。
臨界區:即共享的數據
阻塞和非阻塞:
死鎖、飢餓和活鎖:死鎖為互不讓行,飢餓為一直拿不到資源,活鎖為一直撞到
2、並發級別
由於臨界區的存在,多線程之間的並發必須得到控制。根據控制的並發策略,分為阻塞、無飢餓,無障礙,無鎖,無等待 5種
3、Java語言相關:JMM(Java內存模型)
JMM中的關鍵技術點都是圍繞着多線程的原子性、可見性和有序性來建立的
(1)、原子性:操作不可中斷
(2)、可見性:當一個線程修改了某個共享變量的值時,其他線程是否立即知道這個修改。
(3)、有序性:程序執行時,可能會進行指令的重排來達到優化效果,但在多線程中,由於線程的相互影響,重新排序的線程會打亂其他的線程的執行結果。
二、Java並行
1、進程與線程
進程是計算機中的程序關於某數據集合上的一次運動活動,是系統進行資源分配的基本單位。進程是程序的基本執行實體,進程是線程的容器。
2、線程的狀態轉換
Thead類方法:start() 開啟線程,run()線程執行實體,sleep() 睡眠線程不會釋放資源,yield() 讓出CPU,join() 等待線程運行結束,suspend() 掛起,resume() 重啟
Object類方法:wait() 釋放對象監聽器,線程進入阻塞狀態;notify() 隨機喚醒一個,notifyAll() 喚醒所有。wait,notify,notifyAll 要在Synchronize同步塊中出現,因為其也會出現並發問題
3、volatile
volatile關鍵字告訴虛擬機要主要不要隨意變動優化目標指令,對JMM中有序性。但通過volatile是無法保證原子性操作的。
三、Java並發包
0、並發集合簡介
ConcurrentHashMap:高效並發HashMap,線程安全
CopyOnWriteArrayList:在讀多寫少的場合,這個List性能非常好,遠遠浩宇Vector,都是線程安全
ConcurrentLinkedQueue:高效並發隊列,使用鏈表實現線程安全
BlockingQueue:一個JDK內部通過鏈表、數組等實現的阻塞 接口
ConcurrentSkipListMap:跳表的實現,這是一個Map,使用跳表的數據結構進行快速查找
1、BlockingQueue
此接口是一個線程安全
的 存取實例
的隊列。使用場景
BlockingQueue通常用於一個線程生產對象,而另外一個線程消費這些對象的場景。
2、HashMap、HashTable、ConcurrentHashMap對比
HashMap 線程不安全,HashTable,ConcurrentHashMap線程安全
ConcurrentHashMap 采用鎖分段技術比HashTable更加高效
四、並行模式與算法
1、單例模式
餓漢模式,缺點是不能控制單例生成時間
public class Singleton{ private Singleton();//私有化構造函數,防止new private static Singleton instance = new Singleton();//類加載時創建 public static Singleton getInstance(){ return instance; } }
懶漢模式,缺點是使用synchronized關鍵字影響多並發性能
public class LazySingleton{ private LazySingleton(); private static LazySingleton = null; puhblic static synchronized LazySingleton getInstance(){ if(instance ==null) instance = new LazySingleton(); return instance; } }
綜合兩種模式的實現,使用內部類
public class StaticSingleton{ private LazySingleton(); private static class SingletonHolder{ private static StaticSingleton instance = new StaticSingleton(); } public static StaticSingleton getInstance(){ return SingletonHolder.instance; } }
2、不變模式
3、生產者消費者
4、Future模式
。。。。