1、什么是线程安全性
当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类线程安全。
2、原子性
由于不恰当的执行时序而出现不正确的结果是一种非常重要的情况,它有一个正式的名字:竞态条件。
- 最常见的静态条件是先检查后执行,通过一个可能失效的观测结果决定下一步的动作。
- 要避免竞态条件,就必须在某个线程修改变量时,通过某种方式阻止其他线程使用这个变量。
3、加锁机制
3.1 内置锁
- 静态的synchronized方法以Class对象为锁。
- 每个Java对象都可以用作一个实现同步的锁,这些锁被称为内置锁。
3.2 重入
- 内置锁是可重入的,因此如果某个线程试图获得一个已由它自己持有的锁,那么这个请求就会成功。
public class Widget {
public synchronized void doSomething() {}
}
public class LoggingWidget extends Widget {
public synchronized void doSomething() {
super.doSomething();
}
}
4、用锁来保护状态
对于每个包含多个变量的不变性条件,其中涉及的所有变量都需要由同一个锁来保护。
5、活跃性与性能
- 缩小同步代码快的作用范围
- 当执行时间较长的计算或可能无法快速完成的操作时,一定不要持有锁。