02_线程安全性
线程安全性
一、什么是线程安全?
当多个线程访问某个类时,这个类始终能表现出正确的行为,就称这个类是线程安全的
线程安全类,一般都封装了必要的同步机制,使用时无需额外进行同步
二、线程安全隐患从何而来?
线程安全性,来自多个线程同时访问共享和可变的状态
共享,意味着可以被多个线程访问
可变,意味着状态的值在其生命周期内可以发生变化
一个对象是否是线程安全的,取决于它是否被多个线程访问
三、如何实现线程安全?
1、无状态对象,一定是线程安全的
线程安全性,就是因为存在共享和可变的状态。
如果一个对象没有任何状态(没有任何共享和可变的状态),就不存在线程安全问题。
2、单一状态,可以使用原子类来维护,从而避免线程安全问题
原子操作,是指对于访问同一个状态的所有操作而言,是一些列不可分割的操作。
比如,“读取-修改-写入”(例如递增运算),为了保证线程安全,要求这些操作是原子的。
使用原子类来维护状态的对象,一定是线程安全的。
3、状态的复合操作,需要加锁同步机制来保证线程安全
原子类本身是线程安全的,但是多个原子操作组合在一起,就未必是线程安全的。
使用加锁同步机制,可以保证访问共享状态的复合操作是线程安全的。
使用加锁同步机制,必须保证同一个状态从始至终都只由同一个锁来保护。
同步锁是可重入的,即在同一个线程中,可以多次获取同一个锁,但是最后也要保证释放这么多次锁。
同步锁是互斥的,最多只有一个线程持有这个锁。