線程安全和線程不安全的區別


進程和線程:

1)進程是靜態的,其實就是指開啟的一個程序;而線程是動態的,是真正執行的單元,執行的過程。其實我們平時看到的進程,是線程在執行着,因為線程是作為進程的一個單元存在的。

2)同樣作為基本的執行單元,線程是划分得比進程更小的執行單位。

3)每個進程都有一段專用的內存區域。與此相反,線程卻共享內存單元(包括代碼和數據),通過共享的內存單元來實現數據交換、實時通信與必要的同步操作。

1、創建線程的方式:

創建方式一:繼承Thread

    1:定義一個類繼承Thread

    2:覆蓋Thread中的run方法(將線程運行的代碼放入run方法中)。

    3:直接創建Thread的子類對象

    4:調用start方法(內部調用了線程的任務(run方法));作用:啟動線程,調用run方法

 

方式二:實現Runnable

    1:定義類實現Runnable接口

    2:覆蓋Runnable接口中的run方法,將線程的任務代碼封裝到run中

    3:通過Thread類創建線程對象

4、並將Runnable接口的子類對象作為Thread類的構造函數參數進行傳遞

作為參數傳遞的原因是讓線程對象明確要運行的run方法所屬的對象。

區別:

       繼承方式:線程代碼放在Thread子類的run方法中

       實現方式:線程存放在接口的子類run方法中;避免了單繼承的局限性,建議使用。

2、線程狀態:

新建:start()

臨時狀態:具備cpu的執行資格,但是無執行權

運行狀態:具備CPU的執行權,可執行

凍結狀態:通過sleep或者wait使線程不具備執行資格,需要notify喚醒,並處於臨時狀態。

消亡狀態:run方法結束或者中斷了線程,使得線程死亡。

3、多線程安全問題:

多個線程共享同一數據,當某一線程執行多條語句時,其他線程也執行進來,導致數據在某一語句上被多次修改,執行到下一語句時,導致錯誤數據的產生。

因素:多個線程操作共享數據;多條語句操作同一數據

解決:

       原理:某一時間只讓某一線程執行完操作共享數據的所有語句。

       辦法:使用鎖機制:synchronized或lock對象

4、線程的同步:

當兩個或兩個以上的線程需要共享資源,他們需要某種方法來確定資源在某一刻僅被一個線程占用,達到此目的的過程叫做同步(synchronization)。

同步代碼塊:synchronized(對象){},將需要同步的代碼放在大括號中,括號中的對象即為鎖。

同步函數:放於函數上,修飾符之后,返回類型之前。

5、wait和sleep的區別:(執行權和鎖區分)

wait:可指定等待的時間,不指定須由notify或notifyAll喚醒。

       線程會釋放執行權,且釋放鎖。

sleep:必須制定睡眠的時間,時間到了自動處於臨時(阻塞)狀態。

       即使睡眠了,仍持有鎖,不會釋放執行權。

 

Android的進程與線程:

1、進程的生命周期:

1)、進程的創建及回收:

       進程是被系統創建的,當內存不足的時候,又會被系統回收

2)、進程的級別:

Foreground Process              前台進程

Visible Process              可視進程

Service Process             服務進程:可以提高級別的

Background Process       后台進程

Empty Process              空進程(無組件啟動,做進程緩存使用,恢復速度快)

 

總結用的安全與不安全API

  Hashtable-->HashMap

  StringBuffer-->StringBuilder

  線程安全就是為了在單們時間內某個線程操作的是同樣的數據


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM