文章目录
临界区模式/以一个线程执行模式
共享资源的线程安全
不变模式
不变类
实例状态绝不会改变的类
访问这个实例时,可以省去使用共享互斥机制所会浪费的时间,妥善运用的话将会提高程序性能。
String就是一个不变类
不变模式的安全措施
声明不变类为final
把不变类声明为final,不允许别人定义它的子类,虽然不是不变模式的必要条件,但是预防子类可能修改字段值的一种安全措施。
声明不变类内字段为private
访问权限为private,字段只有类内部可见,虽然不是不变模式的必要条件,但是可以预防子类擅自修改字段值的安全措施。
适用性
当实例产生后,状态不再变化时
字段都是final,且不定义setter方法(用于改变字段值的方法的总称)
实例需要共享,而且访问很频繁时
访问很频繁的话使用synchronized方法需要频繁加锁,性能可能下降
保护性暂挂模式/停等模式
当现在并不适合马上执行某个操作时,就想要执行该操作的线程等待。
施加条件加以防卫
为了某一语句的安全执行,需要满足的条件称为Guarded Suspension Pattern的警戒条件(guard condition)。
不等待的情况、等待的情况
警戒条件成立时,线程不会进入while块,而会直接进行到下一语句,线程不会等待。
当警戒条件不成立时,线程会进入while块中,执行wait开始等待。需要依赖notify/notifyAll才能被唤醒。
阻止模式
适用性
不需要刻意去执行的时候
不想等待警戒条件成立时
Balking Pattern的特征是“不等待”。当警戒条件不成立时,就直接退出,马上进入下一个工作。
警戒条件只有一次成立时
如实例的初始化、终结处理等“无法执行两次以上的操作”。
表达balk结果的方式
忽略balk的发生
不通知调用端balk的发生
以返回值表达balk的发生
以boolean的返回值/或null表示balk的发生
以异常表达balk的发生
方法throw出异常
介于阻止模式与停等模式中间:timeout
在条件成立前等待一定时间,若还不成立酒balk退出。
synchronized没有timeout,也不能中断