为什么要线程同步,对相同的数据的并发操作;数据的处理,写操作(查看、[赋值,修改]);但是无论多少线程的并发,如果只是查看数据,读操作,那么该行为不会对数据产生任何影响。
同步:相当于让某个方法在并发的情况下,依次排列执行,同一时刻,只有一个线程,拥有该方法或者代码块的锁,我们将之称为持锁。
A、把会受到并影响的都通通包裹起来;
B、同步代码块之前可以做一些具有共性的操作,或者不影响数据的操作,同步代码块之后的内容,会受到同步等待的影响;
C、某一个线程,可以同时拥有多个对象的锁,同时拥有多个对象锁的情况下,有可能会产生死锁,虽然这个概率极低,但是只要有这种可能性存在,那么就必须考虑周全。避免发生死锁,需要时刻记着多个对象持锁的顺序;
D、静态方法的同步代码块,同步的是类,不是对象 ;
E、静态和非静态同步最好不要混用。
线程安全性
即便是线程安全的类,在并发情况下,会收到其他变量或者非同步方法的影响,从而对数据安全造成隐患,所以在操作线程安全类的时候,依然需要使用同步。
Volatile
A、把读和写分离开,一个线程负责写,多个线程读
B、布尔类型不受影响
C、javaBean当中,属性可以加volatile修饰,然后给set方法加同步