当前位置: 首页 > 科技观察

一分钟了解线程安全

时间:2023-03-19 23:14:53 科技观察

线程安全也叫可重入性,是指一段代码(类、函数)在多线程的情况下可以正常工作。线程安全之所以成为问题是因为:乱序执行。为了提高CPU的吞吐量,通常会通过乱序技术将“不相关”的指令放在不同的流水线中。分层存储。为了综合访问存储速度、容量和价格,现代计算机通常采用Cache、主存和外存的分级存储。归根结底:CPU太快,存储太慢,尤其是多核、多处理器技术让CPU更快——这个问题更加突出。有两种方法可以使类或函数线程安全:加锁,可以使无序变得有序;lock也可以触发“回写”,保持Cache和内存一致;copy,每个线程一份数据,数据不共享;示例Java中的synchronized关键字会给方法加锁,增加现在是线程安全的,锁会在多线程调用时由并行变为串行。每个线程都有自己的CounterService,彼此之间没有数据共享。扩展的SpringMVC中的Controller是在BeanFactory启动时实例化的,一个Controller在整个系统中只有一个实例。因此,Controller中定义的成员变量不是线程安全的。例如下面的代码是错误的:正确的做法应该是:在方法上加锁或者使用@Scope注解,让SpringMVC在每次收到新的请求时都重新刷新一个Controller。【本文为专栏作家“行森”原创文章,转载请联系作者获得授权】点此阅读更多本作者好文