新聞中心
線程安全也叫可重入,是指一段代碼(類(lèi)、函數(shù))可以在多線程情況下正常工作。

在寧波等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶(hù)提供成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作定制設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)營(yíng)銷(xiāo)推廣,成都外貿(mào)網(wǎng)站建設(shè),寧波網(wǎng)站建設(shè)費(fèi)用合理。
線程安全之所以成為問(wèn)題是由于:
- 亂序執(zhí)行,為了提高 CPU 的吞吐率,通常會(huì)通過(guò)亂序技術(shù)把“無(wú)關(guān)”的指令在不同流水線上。
- 層次化存儲(chǔ),為了綜合訪問(wèn)存儲(chǔ)的速度、容量、價(jià)格,現(xiàn)代計(jì)算機(jī)通常采用 Cache、主存、外存的層次化存儲(chǔ)。
歸根結(jié)底:CPU 太快,存儲(chǔ)太慢,特別是多核、多處理器技術(shù)讓 CPU 更快——問(wèn)題也更加凸出。
讓一個(gè)類(lèi)或者函數(shù)線程安全有兩種方法:
- 加鎖,鎖可以讓亂序變的有序;鎖還可以觸發(fā)“回寫(xiě)”,讓 Cache 和內(nèi)存保持一致;
- 復(fù)制,每個(gè)線程一份數(shù)據(jù),不共享數(shù)據(jù);
實(shí)例
Java 中的synchronized關(guān)鍵字會(huì)為方法增加一個(gè)鎖,increase現(xiàn)在是線程安全的,多線程調(diào)用時(shí)鎖會(huì)把并行變成串行。
每個(gè)線程都有一個(gè)自己的CounterService彼此之間不存在數(shù)據(jù)共享。
擴(kuò)展
Spring MVC 中的 Controller 在 BeanFactory 啟動(dòng)的時(shí)候被實(shí)例化,對(duì)于一個(gè) Controller 而言在整個(gè)系統(tǒng)中只有一個(gè)實(shí)例。所以定義在 Controller 中的成員變量是線程不安全的,比如下面的代碼是錯(cuò)誤的:
正確的做法應(yīng)該是:
為方法增加鎖
或者
利用@Scope 注解讓 Spring MVC 每次接到新請(qǐng)求時(shí)都重新 new 一個(gè) Controller。
【本文是專(zhuān)欄作者“邢森”的原創(chuàng)文章,轉(zhuǎn)載請(qǐng)聯(lián)系作者本人獲取授權(quán)】
新聞標(biāo)題:一分鐘理解線程安全
文章URL:http://www.dlmjj.cn/article/djsechj.html


咨詢(xún)
建站咨詢(xún)
