1
非线程安全即多个线程对同一个对象中的实例变量进行并发访问时产生了脏读;线程安全即在并发访问时,获取的实例变量值是经过同步处理的,不会出现脏读。对于实例变量(共享资源)的并发访问会出现非线程安全问题,而方法内的局部变量则不会出现该问题。
2
线程安全的做法:对实例变量进行同步控制、用方法私有变量代替实例变量(参数传递的方式)、使用ThreadLocal保存。
3
synchronized可作用于方法、代码块,同一时间只能有一个线程执行synchronized修饰的代码。
4
synchronized和static同时修饰方法时,则对当前方法所在的Class持有锁,锁住的是当前的Class,即Class锁;synchronized修饰非static方法时,持有的是当前类对象的锁,即对象锁;synchronized(对象),则持有的是这个对象的锁;synchronized(this),则持有的是当前类对象的锁。
5
Class锁和对象锁修饰的方法是异步交叉执行的,因为它们的锁不同。
6
synchronized(类)方式和Class锁的作用是一样的。
7
synchronized修饰非static方法方式或synchronized(对象)方式进行同步控制时,多个线程并发访问同一个类的多个不同实例的相同方法时,这些方法的执行不是排队执行的,是异步交叉执行,只有多个线程同时持有相同的对象锁,这些线程之间才会同步执行。
8
要想实现多线程并发的同步控制,则需要对同一个类的同一个实例进行锁的控制,即使用同一个"对象监视器"。
9
synchronized有锁重入的功能,即synchronized方法或代码块的内部调用本类的其它synchronized方法或代码块可以再次得到锁。当存在父子类继承关系时,子类可以通过锁重入调用父类的同步方法。
10
当程序抛出异常时,持有的锁会自动释放。
11
同步的特性不可以继承。
12
volatile会强制从主内存中读取变量的值,而不是从线程私有的工作内存中取值;volatile会强制将工作内存中的值写入主内存中。
13
volatile只能保证数据的可见性,即保证多线程间的数据可见;不能保证数据的原子性,不具备同步性,即可能出现脏读,当新值依赖于旧值时就会出现。
14
在使用原子类时,如果方法与方法之间的调用不是原子的,可能会出现执行结果的不安全。