大多數高級Java開發職位都要求開發者精通多線程技術并且有豐富的Java程序開發、調試、優化經驗,多線程并發編程是Java編程中重要的一塊內容,也是面試重點覆蓋區域,所以學好多線程并發編程對我們來說極其重要的。下面我們一起學習一下java多線程方面的知識。
線程安全到底在說什么?
多線程編程中有三個核心概念,把握住這三個核心概念,以此為脈絡來學習多線程的知識,是一個不錯的方法。三個核心概念分別是可見性、原子性、順序性。所以我們討論線程安全的問題,基本圍繞這三個概念來展開的,下面我們看下這三個概念。
可見性
可見性是指,當多個線程并發訪問共享變量時,一個線程對共享變量的修改,其它線程能夠立即看到。CPU從主內存中讀數據的效率相對來說不高,現在主流的計算機中,都有幾級緩存。每個線程讀取共享變量時,都會將該變量加載進其對應CPU的高速緩存里,修改該變量后,CPU會立即更新該緩存,但并不一定會立即將其寫回主內存(實際上寫回主內存的時間不可預期)。此時其它線程(尤其是不在同一個CPU上執行的線程)訪問該變量時,從主內存中讀到的就是舊的數據,而非第一個線程更新后的數據。這一點是操作系統或者說是硬件層面的機制,所以很多應用開發人員經常會忽略,這個問題是很多開發人員忽略或者理解錯誤的一點。
原子性
是指一個操作多含多條指令,要么全部執行,要么全部都不執行。這一點,跟數據庫事務的原子性概念差不多。舉個例子就是銀行轉賬就需要操作的原子性。
順序性
順序性指的是,程序執行的順序按照代碼的先后順序執行。在Java內存模型中,允許編譯器和處理器對指令進行重排序,但是重排序過程不會影響到單線程程序的執行,卻會影響到多線程并發執行的正確性。所以多線程操作,就帶來了一些順序性的問題。
java創建線程
創建線程java有四種方法,下面我們詳細看一下如何實現。
繼承thread類