1 什么是线程安全
线程安全:当多个线程访问同一个类(对象或方法)时,如果这个对象始终能表现出正确的行为,那么认为这个类(对象或方法)是线程安全的。
2 synchronized 关键字解释
synchronized:可以在任意对象及方法上加锁,而加锁的这段代码称为 “临界区”或“互斥区”。
synchronized取得的锁都是对象锁,而不是把一段代码当锁。所以代码中哪个线程先执行synchronized的方法,哪个线程就持有该方法所属对象的锁。
在静态方法上加synchronized关键字,表示锁.class类,类一级别的锁。
3 对象锁的同步和异步
有两个线程T1,T2 。 T1先持有对象O的锁。
1) T2可以异步调用O对象的非synchronized修饰的方法。
2) 如果这个时候T2调用O对象synchronized修饰的方法,则需等待,也就是同步。
4 脏读
业务整体需要使用完整的synchronized,保持业务的原子性。
5 死锁
在设计程序时应该避免双方相互持有对方的锁的情况
线程T1,T2
在T1的同步代码块里,同步调用T2的同步代码块
在线程T2的同步代码块里,同步调用T1的代码块
伪代码
synchronized (m1) {
synchronized (m2){
}
}
synchronized (m2){
synchronized (m1){
}
}
6 代码块加锁
1) 使用sychronized代码块加锁,比较灵活。
2) 可以减小锁的粒度,提高性能