并发编程第2章,基础篇
2.1线程安全
1并发编程即是要控制对共享的可变的变量的存取操作顺序
2保证同步的方法,在语法/代码级别来说,可以使用synchronized,volatile,或者是现式的锁,或者使用原子变量
3好的设计是避免线程危险的良方,使用OO的方法尽量避免线程的隐患。
4线程安全的program不一定是由线程安全的classes组成的
5什么是线程安全,如何区分哪些是线程安全的哪些不是?
6无状态的类是线程安全的,本地变量/局部变量在线程栈中存储,所以互不影响。
2.2原子性
1原子操作时线程安全的,对于check-the-act和read-modify-write来说,将这些操作封装成原子操作则能保证线程安全。
2对于check-then-act来说,比如常见的单例模式,有很多就是check-then-act
3对于read-modify-write来说,典型的i++就是。是由三个原子操作组成
2.3锁
如果有多个原子实例变量,那么在程序执行过程中,对于这几个原子变量的操作就变成非原子的操作了,比如
class A{
AA a;
BB b;
method(){
change a,b
.....
}
}
对于这个操作来说,尽管a,b都是原子变量但是由于method的操作,使a,b的状态不能处于原子的变化,在修改a的时候,b有可能被读取。但是b却没有被正确设置,因为b有可能是需要通过a运算得到的值。
对于这种情况,就需要使用锁,将需要划分成原子操作的部分代码进行锁定,成为新的原子操作,这部分代码,只允许一个线程同时访问,其他线程如果需要执行,则均需要等待当前执行线程的解锁。
sysnizatized是可重入锁,是基于每线程的,同一线程获得锁之后,可重复进入
2.4通过锁监视状态
2.5性能
1只将需要同步的代码同步,如果需要在一段代码中划分超过两个以上的同步块,那么需要权衡一下是否需要划分这么多,是否可以将同步块合并,因为获取和释放锁也是需要开销的
2避免对运行速度慢的代码进行同步,比如计算密集型的,或者网络的等
2.1线程安全
1并发编程即是要控制对共享的可变的变量的存取操作顺序
2保证同步的方法,在语法/代码级别来说,可以使用synchronized,volatile,或者是现式的锁,或者使用原子变量
3好的设计是避免线程危险的良方,使用OO的方法尽量避免线程的隐患。
4线程安全的program不一定是由线程安全的classes组成的
5什么是线程安全,如何区分哪些是线程安全的哪些不是?
6无状态的类是线程安全的,本地变量/局部变量在线程栈中存储,所以互不影响。
2.2原子性
1原子操作时线程安全的,对于check-the-act和read-modify-write来说,将这些操作封装成原子操作则能保证线程安全。
2对于check-then-act来说,比如常见的单例模式,有很多就是check-then-act
3对于read-modify-write来说,典型的i++就是。是由三个原子操作组成
2.3锁
如果有多个原子实例变量,那么在程序执行过程中,对于这几个原子变量的操作就变成非原子的操作了,比如
class A{
AA a;
BB b;
method(){
change a,b
.....
}
}
对于这个操作来说,尽管a,b都是原子变量但是由于method的操作,使a,b的状态不能处于原子的变化,在修改a的时候,b有可能被读取。但是b却没有被正确设置,因为b有可能是需要通过a运算得到的值。
对于这种情况,就需要使用锁,将需要划分成原子操作的部分代码进行锁定,成为新的原子操作,这部分代码,只允许一个线程同时访问,其他线程如果需要执行,则均需要等待当前执行线程的解锁。
sysnizatized是可重入锁,是基于每线程的,同一线程获得锁之后,可重复进入
2.4通过锁监视状态
2.5性能
1只将需要同步的代码同步,如果需要在一段代码中划分超过两个以上的同步块,那么需要权衡一下是否需要划分这么多,是否可以将同步块合并,因为获取和释放锁也是需要开销的
2避免对运行速度慢的代码进行同步,比如计算密集型的,或者网络的等