1. “非线程安全”问题存在于"实例变量"中,方法内的变量为线程安全。
2. 关键字synchronized 取得的锁都是对象锁。
3. 如果多个线程访问多个对象,则JVM会创建多个锁。
4. A线程先持有object对象的Lock锁,B线程可以异步的方式调用object对象中的非synchronized类型的方法。
5. A线程先持有object对象的Lock锁,B线程如果在这时候调用object对象中的synchronized类型的方法,则需要同步。
6. synchronized锁重入:在使用synchronized时,当一个线程得到一个对象锁后,再次请求此对象锁时是可以再次得到该对象的锁的。这也说明,在一个synchronized方法\块的内部调用本类的其他synchronized方法\块时,是永远可以得到锁的。
7. 可重入锁也支持在父子类继承的环境中。
8. 当存在父子类继承关系时,子类是完全可以通过"可重入锁"调用父类的同步方法的。
9. 当出现异常时,锁自动释放。
10. 同步不具有继承性。
11. synchronized同步语句块:synchronized 同步方法在某些情况下有弊端,在这种情况下,可以使用synchronized同步语句块来解决。
12. synchronized(this) 使用的"对象监视器"是一个。
13. synchronized还可以用在static静态方法上,那是对*.java对应的Class类进行加锁。
14.
15. synchronized代码块通常情况下不适用String作为锁对象,因为String常量池带来的问题。
16. volatile:主要作用是使变量在多个线程间可见。它强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值。
17. volatile变量不支持原子性。
18. synchronized vs volatile
- volatile是线程同步的轻量级实现,所以性能优于synchronized,并且volatile只能适用于修饰变量,而synchronized可以修饰方法,代码块。
- 多线程访问volatile不会发生阻塞,而synchronized会发生阻塞。
- volatile能保证数据的可见性,但不能保证原子性;synchronized可以保证原子性,也可以间接保证可见性,因为它会将私有内存和公共内存中的数据做同步。
- volatile解决的是变量在多个线程中的可见性,而synchronized解决的是多线程之间资源的同步性。
19. 变量在内存中工作过程:
read和load阶段:从主存复制变量到当前线程工作内存;
use和asign阶段:执行代码,改变共享变量值;
store和write阶段:用工作内存数据刷新主对应变量的值;
20. AtomicInteger, AtomicLong 原子类。但是原子类在具有逻辑的情况下输出结果也具有随机性。
21. synchronized 代码块具有volatile同步的功能,synchronized可以使具有可视性。