四種方式

start0() native方法 在JVM源碼,java其實(shí)是應(yīng)用層,線程并不是java產(chǎn)生的,而是底層操作系統(tǒng)支持線程,jvm調(diào)用操作系統(tǒng)去創(chuàng)建線程,針對不同平臺做了封裝,在各個操作系統(tǒng)都能創(chuàng)建線程,啟動了線程之后會去回調(diào)run方法

image.png
創(chuàng)建
啟動,設(shè)置狀態(tài)為runnabale

怎么終止線程

一定不是stop! 這是個過期的方法,掛起和恢復(fù)也不推薦使用,
相當(dāng)于Kill-9 雖然能完成效果,不安全,不優(yōu)雅
無法知道被關(guān)閉的線程的狀態(tài),運(yùn)行到一半 被關(guān)閉了。。

Thread.interrupt() 終止才是對的

六種狀態(tài)

線程池原理

線程工具類四種方法

為何不推薦使用現(xiàn)成的方法

自己創(chuàng)建線程 七大參數(shù)含義

阻塞隊(duì)列

JMM內(nèi)存模型

jmm

jmm1

硬盤》內(nèi)存》cpu
cpu計(jì)算能力超強(qiáng),還沒給內(nèi)存,不能一直耗著,或者數(shù)據(jù)還沒傳過來, 所以有cpu緩存這個東西


cpu緩存

volatile

  • 可見性
    某一個線程修改了值寫回主內(nèi)存,其他線程馬上要獲取取通知,你的值不是最新的了,作廢,要重新回去拿到最新的值
  • 不保證原子性
    線程1 拿到值改完之后寫回主內(nèi)存,線程2應(yīng)該去拿到主內(nèi)存的值后再去操作,但是!由于多線程競爭的調(diào)度關(guān)系,兩個都準(zhǔn)備寫,1準(zhǔn)備寫,突然掛起了,線程2寫成了, 去通知的時候,太快了,線程1 也立刻寫回去了,就導(dǎo)致 寫丟失。
    怎么解決? 加鎖 或者 用原子類 atomicInteger atomicRefence
  • 禁止指令重排序
    happen-before


    image.png

    單線程里保證 程序最終執(zhí)行結(jié)果和代碼順序執(zhí)行的結(jié)果一致。
    高考寫卷子不一定按順序?qū)? 效果高,答題可以先寫,先把會做的做了。。。。


    案例

    結(jié)果可能是5也可能是6

雙檢鎖,單例模式,安全性不是百分百
instance = new Singleton() 分為三條指令
1 memory = allocate(); 分配內(nèi)存
2 instance(memory) 初始化對象
3 instance = memory 設(shè)置instance剛剛分配的內(nèi)存地址,此時intance != null

正常順序是1,2,3 但是指令重排后可能是 1,3,2 instance != null 但是對象還沒有初始化完成!

憑什么atomicInteger 能解決原子性 又不用加鎖

CAS, Unsafe類+自旋鎖
cas :比較和交換


cas概述
image.png

image.png

image.png

image.png

既保證了一致性 又提高了并發(fā)性
syn 一致性保證,并發(fā)性下降
cas : 如果這個線程倒霉,循環(huán)時間長,cpu開銷大
   只能保證一個共享變量的原子操作,對于多個共享變量的操作,無法保證操作的原子性,只能加鎖

ABA問題是啥? 原子更新引用知道嗎?
貍貓換太子? 共享變量是A t1 和 t2 同時拿到A, t2吧A改成B ,然后吧B改成A, t1去執(zhí)行的時候發(fā)現(xiàn)太好了,還是A,我可以改了,但是中間已經(jīng)被改過又改回來了。
首尾是一樣的, 過程不知道被改了多少次了。。


image.png

ABA代碼演示

引發(fā)的問題:

解決ABA: 帶時間戳 或者說版本號,改一次就會變
單鏈表組成的并發(fā)棧問題舉例~

cas和 synchroized使用場景

  • 資源競爭較少的情況使用synchroized 同步進(jìn)行線程阻塞和喚醒以及內(nèi)核的切換會消耗額外的cpu,而CAS基于硬件實(shí)現(xiàn),不需要進(jìn)入內(nèi)核,不需要切換線程,操作自旋幾率較少,可以獲得更好的性能
  • 對于資源競爭嚴(yán)重的情況,CAS自旋的概率會比較大,從而浪費(fèi)更多的CPU資源
  • 使用CAS在線程沖突嚴(yán)重的情況下,會大幅降低程序性能,CAS只適用于線程沖突較少的情況下使用
  • synchronized在jdk1.6之后,依靠Lock-Free,基本思路是自旋后阻塞,在線程沖突較少的情況下,可以獲得和CAS類似的性能,而線程沖突嚴(yán)重的情況下,性能遠(yuǎn)高于CAS

wait和sleep的區(qū)別

sleep()是使線程暫停執(zhí)行一段時間的方法,是Thread的靜態(tài)方法, 不會釋放鎖資源
wait()也是一種使線程暫停執(zhí)行的方法。是Object的 fangfa 會釋放鎖資源

拓展鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容