【Java 并发编程】线程简介 ( 并发类型 | 线程状态 | CPU 数据缓存 )
文章目錄
- 一、并發(fā)類型
- 二、線程狀態(tài)
- 三、CPU 數(shù)據(jù)緩存
一、并發(fā)類型
并發(fā)類型 :
- Thread
- Runnable
- Future
- ThreadPool
其中 Runnable , ThreadPool 都是基于 Thread 執(zhí)行的 ;
二、線程狀態(tài)
線程狀態(tài) :
線程剛創(chuàng)建時 , 處于 " 新建狀態(tài) " ;
調(diào)用線程 start() 方法之后 , 線程進入 Runnable " 可運行狀態(tài) " , 此時等待 OS 調(diào)度分配 CPU 時間片 運行 ;
線程分配到 CPU 時間片 之后 , 線程進入 Running " 運行狀態(tài) " , 如果線程分配的 CPU 時間片運行完畢 , 線程又回到 Runnable " 可運行狀態(tài) " ;
如果運行過程中 , 手動調(diào)用了 Thread.sleep() 或 join()方法 , 線程進入了 " 阻塞狀態(tài) " , 線程喚醒之后又回到 Runnable " 運行狀態(tài) " ;
線程運行完畢之后 , 或者線程執(zhí)行出現(xiàn)異常 , 進入 Dead " 死亡狀態(tài) " ;
三、CPU 數(shù)據(jù)緩存
程序執(zhí)行時 , 主要是 CPU 執(zhí)行程序中的指令 , 指令的運行 , 還需要 加載相應(yīng)的數(shù)據(jù) ;
CPU 運行的速度很快 , 如果每次 使用 I/O 總線訪問內(nèi)存獲取 CPU 執(zhí)行所需的數(shù)據(jù) , 無法將 CPU 的性能優(yōu)勢發(fā)揮到最大 ;
數(shù)據(jù)從 磁盤 中讀取 , 加入到 內(nèi)存 中 , 線程執(zhí)行后 , 會將需要操作的數(shù)據(jù)加入到 CPU 緩存 中 ;
CPU 緩存分為 L1 , L2 , L3 , 333 個級別的緩存 , 如下圖所示 ;
CPU 執(zhí)行線程時 , 不直接操作內(nèi)存中的數(shù)據(jù) , 而是通過 CPU 緩存進行處理 ;
JMM ( Java Memory Model - Java 內(nèi)存模型 ) 參考了 CPU 緩存模型 , CPU 都是多核的 , 每個核中都有 L1 和 L2 緩存 , L3 緩存整個 CPU 的所有核心共同使用 ;
Java 內(nèi)存模型只是一種規(guī)范 ;
Java 虛擬機運行時內(nèi)存 , 是不同的虛擬機實現(xiàn)的不同的內(nèi)存使用方式 ;
每種虛擬機的底層實現(xiàn)都是不同的 ;
Java 線程 運行時 , 每個 Java 線程都配套一個 工作內(nèi)存 , 然后工作內(nèi)存從 主內(nèi)存 中獲取數(shù)據(jù) , 主內(nèi)存被所有工作內(nèi)存共享 ;
- 工作內(nèi)存 就是 線程的 本地內(nèi)存 , 其中存儲的是主內(nèi)存中的 變量副本 , 使用主內(nèi)存的變量前 , 先將變量拷貝工作內(nèi)存中 ;
- 當在線程中 修改了工作內(nèi)存中的數(shù)據(jù) , 需要同時 將變量的修改同步到主內(nèi)存中 ;
這里的 工作線程 / 本地線程 相當于 CPU 中的 L1 / L2 緩存 , 主內(nèi)存 相當于 CPU 中的 L3 緩存 ;
如果多個線程同時對 主內(nèi)存 中的同一個變量進行修改 , 變量的值被不同線程按照不同順序進行改變 , 主線程中的這個變量是 線程不安全的 ;
總結(jié)
以上是生活随笔為你收集整理的【Java 并发编程】线程简介 ( 并发类型 | 线程状态 | CPU 数据缓存 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java 并发编程】线程简介 ( 进程
- 下一篇: 【Java 并发编程】线程简介 ( 原子