一分钟理解线程安全

开发 开发工具
线程安全也叫可重入,是指一段代码(类、函数)可以在多线程情况下正常工作。线程安全之所以成为问题是由于CPU 太快,存储太慢,特别是多核、多处理器技术让 CPU 更快——问题也更加凸出。

线程安全也叫可重入,是指一段代码(类、函数)可以在多线程情况下正常工作。

线程安全之所以成为问题是由于:

  • 乱序执行,为了提高 CPU 的吞吐率,通常会通过乱序技术把“无关”的指令在不同流水线上。
  • 层次化存储,为了综合访问存储的速度、容量、价格,现代计算机通常采用 Cache、主存、外存的层次化存储。

归根结底:CPU 太快,存储太慢,特别是多核、多处理器技术让 CPU 更快——问题也更加凸出。

[[234005]]

让一个类或者函数线程安全有两种方法:

  • 加锁,锁可以让乱序变的有序;锁还可以触发“回写”,让 Cache 和内存保持一致;
  • 复制,每个线程一份数据,不共享数据;

实例

Java 中的synchronized关键字会为方法增加一个锁,increase现在是线程安全的,多线程调用时锁会把并行变成串行。

每个线程都有一个自己的CounterService彼此之间不存在数据共享。

扩展

Spring MVC 中的 Controller 在 BeanFactory 启动的时候被实例化,对于一个 Controller 而言在整个系统中只有一个实例。所以定义在 Controller 中的成员变量是线程不安全的,比如下面的代码是错误的:

正确的做法应该是:

为方法增加锁

或者

利用@Scope 注解让 Spring MVC 每次接到新请求时都重新 new 一个 Controller。

【本文是51CTO专栏作者“邢森”的原创文章,转载请联系作者本人获取授权】

戳这里,看该作者更多好文

责任编辑:赵宁宁 来源: 51CTO专栏
相关推荐

2017-02-21 13:00:27

LoadAverage负载Load

2018-07-31 16:10:51

Redo Undo数据库数据

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-07-17 07:44:25

云计算边缘计算IT

2016-09-12 17:28:45

云存储应用软件存储设备

2020-07-09 07:37:06

数据库Redis工具

2017-07-06 08:12:02

索引查询SQL

2020-05-21 19:46:19

区块链数字货币比特币

2022-07-18 06:16:07

单点登录系统

2018-07-31 15:05:51

Java公平锁线程

2018-03-27 09:28:33

缓存策略系统

2016-12-16 11:05:00

分布式互斥线程

2015-11-12 10:32:40

GitHub控制系统分布式

2021-08-06 08:50:45

加密货币比特币区块链

2011-02-21 17:48:35

vsFTPd

2016-12-21 15:08:14

数据库垂直拆分

2023-06-12 07:18:26

CPU主频高频率
点赞
收藏

51CTO技术栈公众号