什麼是進程,什麼是線程?
任何一個程序的運行都是一個進程,進程是由一個或者多個線程組成。線程是進程的最小單位。
例如一個公司就是個進程,公司裏的員工就是這個進程裏的線程。
線程併發: 這個公司只有一個廁所,早上大家都同時來蹲坑,這就產生了併發。(對公共資源的同時操作
)
線程安全: 經常用來描述一段代碼在併發的情況下線程的調度順序不影響任何結果。
線程同步: 通過人爲的控制和調度保證共享資源的多線程訪問成爲線程安全。
鎖: 某一個人搶到了這個坑,把門鎖了上,其它人進不去,這就叫線程鎖。(避免同時對公共資源操作產生數據錯誤,在某一個線程搶到公共資源就對其進行上鎖,其它線程就需要等待
)
synchronized: java線程的同步鎖. 被synchronized修飾的代碼多線程訪問時,會被阻塞.
synchronized和volatile區別
volatile
只保存了內存的可見性
synchronized
既保存了操作的原子性,又保證了內存的可見性
多線程的內存模式: main memory(主存),working memory(本地棧)。在處理時會把主存load到本地棧,完成操作後save回去。
線程的創建: 繼承Thread類,實現Runnable接口。
run()和start()區別: run()沒有啓新線程(主線程按同步執行
),start()方法纔會調Thread的native的start0()。
線程池: 首先創建一些線程,它們的集合稱爲線程池。-- 線程池很好的提高性能,線程池會在系統啓動的時候創建大量的空閒線程。當程序將一個任務傳給線程池時,線程池就會啓動一條來執行這個任務。任務執行完成再次返回線程池成爲空閒狀態。java自帶線程池java.util.concurrent包Executors.java,Spring自帶的線程池org.springframework.scheduling.concurrent包下的ThreadPoolTaskExecutor
線程的幾種狀態(Thread.State
):
NEW
創建而未啓動RUNNABLE
READY
表示可以被jvm調度器進行調度
RUNNING
線程正在運行BLOCKED
一個線程發起一個阻塞,相應的線程處於該狀態WAITING
一個線程執行了某些方法調用後就會處於這種無限等待其他線程執行特定操作的狀態TIMED_WAITING
和WAITING類似,該狀態並非無線等待,而是處於有限時間等待TERMINATED
已經執行結束的線程
在多線程環境中狀態由RUNNABLE轉換爲非RUNNABLE狀態時相應的上線文信息會被保存——佔用內存