线程安全的对象生命期管理

Posted joeylee97

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程安全的对象生命期管理相关的知识,希望对你有一定的参考价值。

线程安全的对象生命期管理

解决对象构造的线程安全

  • 当我们需要动态分配对象时( 懒加载 ), 如果在多个线程中运行这一部分代码,可能出现多次初始化的问题。

单例模式

c++ 11 之后static 变量的初始化是线程安全的。可以利用静态变量来实现单例模式,解决重复初始化的问题。

std::call_once

个人感觉不够优美,要传递一个flag 来标识初始化情况

线程访问未初始化的资源

比如在Thread类中,std::thread被构造之后立即开始执行线程中函数,然而函数中访问的资源可能还没有被初始化。
解决方案:

  1. 成员初始化列表控制构造顺序
  2. 手动控制线程函数的运行
  3. 不要泄露this指针

解决对象析构的线程安全

  • 对象的析构问题是一个比较特别的线程安全问题,在我们析构这个对象的时候如何得知有没有其他线程在使用它?在我们使用这个对象的时候又如何保证它没有被析构(成为野指针)?

解决方案

使用shared_ptr 和 unique_ptr 控制生命周期,使用自定义的析构函数来提供适配性。
使用weak_ptr 探测shared_ptr的生命周期, 避免环状引用

注意

shared_ptr 的引用计数是安全无锁的,然而它本身需要加锁(有两个指针,内部是二段式操作)。
使用shared_from_this
对独有的资源使用std::move + std::unique_ptr

以上是关于线程安全的对象生命期管理的主要内容,如果未能解决你的问题,请参考以下文章

jsp PageContext 对象的生命周期是啥——它是线程安全的吗?

spring的线程安全

Spring与线程安全

并发编程2-线程安全性

Servlet的线程安全

Java线程生命周期及状态Java线程安全的的理解Thread与RunnableJava守护线程