首先代码正确运行,然后提高代码的速度,最好只是当性能测试结果表明这种优化在实际环境中确实能带来性能提升时,才进行优化。
当多个线程访问某个类时,不管运行时环境采用何种调动方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为(不变性条件),那么就称这个类是线程安全的。
一组语句作为一个不可分割的单元被执行
破坏原子性的情况:产生竞态条件
包含了一组必须以原子方式执行的操作以确保线程安全性
在实际情况中,应尽可能地使用现有的线程安全对象来管理类的状态
要保持状态的一致性,就需要在单个原子操作中更新所有相关的状态变量。
Java提供了一种内置的锁机制来支持原子性:同步代码块(以关键字Synchronized修饰)
包括两个部分
* 一个作为锁的对象引用
* 普通锁的对象引用是调用所在的对象
* 静态锁的对象引用是Class
* 一个作为由这个锁保护的代码块
获得内置锁的唯一途径就是进入由这个锁保护的同步代码块或方法
内置锁是可重入的:某个线程试图获得一个已经由它自己持有的锁,那么这个请求就会成功
重入意味着获取锁的操作的粒度是’线程’,而不是’调用’
public class Widget{
public synchronized void doSomething(){}
}
public class LoggingWidget extends Widget{
public synchronized void doSomething(){
//如果内置锁不可重入,将发生死锁
super.doSomething
}
}