国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

閑談線程安全問題

2019-11-14 22:30:11
字體:
供稿:網(wǎng)友
閑談線程安全問題

一、什么是線程安全問題?

  談到線程安全,那么程序必然是運(yùn)行在多線程的環(huán)境中才會有這樣的問題。那是不是只要是多線程的應(yīng)用的代碼都有線程安全問題呢?答案顯然是否定的,比如我們寫的Action就是一個運(yùn)行在多線程環(huán)境中的代碼,web服務(wù)器接收到一個http請求就會創(chuàng)建一個Thread來處理請求,但是我們的Action為啥沒有方法都沒有加同步呢?原因是我們的action對象,每次接收到一個http請求(一個Thread),都會重新創(chuàng)建(new)一個新的action對象,就是不同線程使用的action對象是不同的。說完action,我們再說說service吧,如果項(xiàng)目使用了sPRing,我們都知道spring容器中的對象默認(rèn)是single(單例),也就是程序中service對象只有一個,那么service對象被不同的線程調(diào)用的時候使用的都是一個service對象。所以一般情況下service對象應(yīng)該是一個無狀態(tài)的對象,也就是不包含屬性,如果在某些情況下,你給一個service定義了一個屬性,service方法中對該屬性進(jìn)行了讀和寫操作,這個時候還要不要考慮線程安全問題呢?答案是非常有必要了!

你定義的這個屬性就是一個被多線程共享的資源,同時多線程有讀寫操作,就有可能(注意是有可能)存在線程安全問題。

  總結(jié)一下判斷一個程序存不存在線程安全問題的方法:

  1、程序運(yùn)行在多線程環(huán)境下嗎?

  2、多線程是否會共享一個資源并且對這個共享資源有讀和寫操作?

  如果滿足以上兩點(diǎn)那就非常有必要考慮線程安全問題。

  所以上面的代碼就是要考慮線程安全問題了。但是你可能會說為啥我知道可能會有線程安全問題,我卻又沒有做任何同步處理?原因是這樣的,要考慮線程安全問題并不代表一定就有線程安全問題。仿佛有點(diǎn)矛盾。因?yàn)槲疫@個業(yè)務(wù)決定了這里不存在線程安全問題,又或者即使這里發(fā)生了線程安全問題,導(dǎo)致的結(jié)果是可以預(yù)計(jì)并且不會對系統(tǒng)產(chǎn)生影響的。所以這里我并沒有做同步控制。所以說是判斷存不存在線程安全問題,還要根據(jù)業(yè)務(wù)特點(diǎn)和發(fā)生問題導(dǎo)致的結(jié)果來判斷。

二、如何解決線程安全問題

1、將對象設(shè)置成無狀態(tài)的

比如上面的service對象盡量不要設(shè)置屬性,那么這個service對象就是無狀態(tài)的,多線程使用這個service對象時不存在共享資源問題。

2、使用局部對象

如果上面的activeTimer是一個方法內(nèi)的對象那么也不存在線程安全問題,因?yàn)槎嗑€程調(diào)用同一個對象的方式時,方法內(nèi)的對象是私有的。

3、如果對象中不得不使用屬性時,比如上面的activeTimer必須要設(shè)置成service對象屬性,那么可以考慮使用ThreadLocal包裝屬性,包裝后的activeTimer就是一個線程安全的,ThreadLocal實(shí)際上是為每個線程都重現(xiàn)創(chuàng)建一個activeTimer對象,各線程用自己的activeTimer,也就避免了線程安全問題,當(dāng)然導(dǎo)致各線程修改的activeTimer不被共享,需要根據(jù)自己的業(yè)務(wù)特點(diǎn)使用。

4、當(dāng)以上3種辦法都不適合的時候,終極大招出來了,使用線程同步技術(shù)。把讀寫共享資源的代碼塊上把鎖,給鎖起來,讓多線程調(diào)用這段代碼的時候按順序來訪問,這樣就不存在線程安全了。java中實(shí)現(xiàn)線程同步(互斥)的方法主要有兩種,使用synchronized和lock。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 常熟市| 咸丰县| 上栗县| 安宁市| 大兴区| 修武县| 泰来县| 平安县| 马山县| 潮安县| 苗栗市| 中超| 翼城县| 奉贤区| 枞阳县| 汝城县| 嘉荫县| 华池县| 密云县| 宝鸡市| 滨州市| 漠河县| 丘北县| 永清县| 永州市| 龙州县| 托克托县| 隆昌县| 永修县| 桂东县| 凭祥市| 兰州市| 泗洪县| 广昌县| 屏南县| 望奎县| 肃宁县| 蒙山县| 河西区| 陈巴尔虎旗| 双辽市|