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