自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一分鐘理解線程安全

開發(fā) 開發(fā)工具
線程安全也叫可重入,是指一段代碼(類、函數)可以在多線程情況下正常工作。線程安全之所以成為問題是由于CPU 太快,存儲太慢,特別是多核、多處理器技術讓 CPU 更快——問題也更加凸出。

線程安全也叫可重入,是指一段代碼(類、函數)可以在多線程情況下正常工作。

線程安全之所以成為問題是由于:

  • 亂序執(zhí)行,為了提高 CPU 的吞吐率,通常會通過亂序技術把“無關”的指令在不同流水線上。
  • 層次化存儲,為了綜合訪問存儲的速度、容量、價格,現代計算機通常采用 Cache、主存、外存的層次化存儲。

歸根結底:CPU 太快,存儲太慢,特別是多核、多處理器技術讓 CPU 更快——問題也更加凸出。

[[234005]]

讓一個類或者函數線程安全有兩種方法:

  • 加鎖,鎖可以讓亂序變的有序;鎖還可以觸發(fā)“回寫”,讓 Cache 和內存保持一致;
  • 復制,每個線程一份數據,不共享數據;

實例

Java 中的synchronized關鍵字會為方法增加一個鎖,increase現在是線程安全的,多線程調用時鎖會把并行變成串行。

每個線程都有一個自己的CounterService彼此之間不存在數據共享。

擴展

Spring MVC 中的 Controller 在 BeanFactory 啟動的時候被實例化,對于一個 Controller 而言在整個系統(tǒng)中只有一個實例。所以定義在 Controller 中的成員變量是線程不安全的,比如下面的代碼是錯誤的:

正確的做法應該是:

為方法增加鎖

或者

利用@Scope 注解讓 Spring MVC 每次接到新請求時都重新 new 一個 Controller。

【本文是51CTO專欄作者“邢森”的原創(chuàng)文章,轉載請聯系作者本人獲取授權】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2018-07-31 16:10:51

Redo Undo數據庫數據

2017-02-21 13:00:27

LoadAverage負載Load

2018-12-12 22:51:24

Java包裝語言

2017-03-30 19:28:26

HBase分布式數據

2018-06-26 10:52:45

2018-06-28 14:00:01

分布式集群架構

2020-05-21 19:46:19

區(qū)塊鏈數字貨幣比特幣

2017-07-06 08:12:02

索引查詢SQL

2022-07-18 06:16:07

單點登錄系統(tǒng)

2011-02-21 17:48:35

vsFTPd

2016-09-12 17:28:45

云存儲應用軟件存儲設備

2020-07-09 07:37:06

數據庫Redis工具

2020-07-17 07:44:25

云計算邊緣計算IT

2018-07-31 15:05:51

Java公平鎖線程

2020-06-11 08:04:12

WDMDWDMMWDM

2013-11-15 07:24:50

4G LTE圖解

2015-11-12 10:32:40

GitHub控制系統(tǒng)分布式

2016-12-16 11:05:00

分布式互斥線程

2018-03-27 09:28:33

緩存策略系統(tǒng)

2021-08-06 08:50:45

加密貨幣比特幣區(qū)塊鏈
點贊
收藏

51CTO技術棧公眾號