线程安全性
1.什么是线程安全
在线程安全的定义中,最核心的概念是正确性。正确性的含义是,某个类的行为与规范完全一致。当对正确性有了一个比较清晰的定义后,就可以定义线程安全性:当多个线程访问某个类时,这个类始终能表现出正确的行为,那这个类就是线程安全的。
举例:无状态对象一定是线程安全的。
大多数Servlet都是无状态的,当Servlet在处理请求时需要保存一些信息时,线程安全才会成为一个问题。
2.原子性
举个例子:语句 ++i;虽然递增操作++i是一种紧凑的语法,使其看上去是一个操作,但这个操作并不是原子的,它并不会作为一个不可分割的操作。实际,他是三个独立的操作:读取i,将值加1,然后赋值。
3.竞态条件
当某个计算的正确性取决于多个线程的交替执行时序时,就会发生竞态条件。最常见的竞态条件是“先检查后执行”,即通过一个可能失效的判断结果来决定下一步动作。
4.复合操作
假定有两个操作A B,如果从执行A的线程来看,当另一个线程执行B时,要么将B全部执行完,要么完全不执行。那么A和B对彼此来说是原子的。
5.加锁
对于可能被多个线程同时访问的可变状态变量,在访问它时都需要持有同一个锁,在这种情况下,我们称状态变量是由这个锁保护的。
6.活跃性与性能
对某些方法进行同步时,会影响性能。比如Servlet的service()方法,当改为同步方法时,每次有一个线程可以执行,那就违背了设计的初衷,无法对高并发的情况进行及时响应。
当使用锁时,应该清楚代码块中实现的功能,以及在执行该代码块时是否需要很长时间,否则会带来活跃性或性能问题。
时间: 2024-10-27 13:24:48