02_线程安全性

线程安全性

一、什么是线程安全?

  • 当多个线程访问某个类时,这个类始终能表现出正确的行为,就称这个类是线程安全的

  • 线程安全类,一般都封装了必要的同步机制,使用时无需额外进行同步

二、线程安全隐患从何而来?

  • 线程安全性,来自多个线程同时访问共享和可变的状态

  • 共享,意味着可以被多个线程访问

  • 可变,意味着状态的值在其生命周期内可以发生变化

  • 一个对象是否是线程安全的,取决于它是否被多个线程访问

三、如何实现线程安全?

1、无状态对象,一定是线程安全的

  • 线程安全性,就是因为存在共享和可变的状态。

  • 如果一个对象没有任何状态(没有任何共享和可变的状态),就不存在线程安全问题。

2、单一状态,可以使用原子类来维护,从而避免线程安全问题

  • 原子操作,是指对于访问同一个状态的所有操作而言,是一些列不可分割的操作。

  • 比如,“读取-修改-写入”(例如递增运算),为了保证线程安全,要求这些操作是原子的。

  • 使用原子类来维护状态的对象,一定是线程安全的。

3、状态的复合操作,需要加锁同步机制来保证线程安全

  • 原子类本身是线程安全的,但是多个原子操作组合在一起,就未必是线程安全的。

  • 使用加锁同步机制,可以保证访问共享状态的复合操作是线程安全的。

  • 使用加锁同步机制,必须保证同一个状态从始至终都只由同一个锁来保护。

  • 同步锁是可重入的,即在同一个线程中,可以多次获取同一个锁,但是最后也要保证释放这么多次锁。

  • 同步锁是互斥的,最多只有一个线程持有这个锁。

作者

jiaduo

发布于

2022-05-15

更新于

2023-04-03

许可协议