一、设计线程安全的类
在设计线程安全类的过程中,需要包含以下三个基本要素:
. 找出构成对象状态的所有变量。
. 找出约束状态变量的不变性条件。
. 建立对象状态的并发访问管理策略。
分析对象的状态,首先从对象的域开始。 变量按作用域划分:
. 全局变量
. 局部变量
. 方法行参
. 异常处理参数
1. 收集同步需求
如果不了解对象的不变性条件与后验条件,那么就不能确保线程安全性。要满足在状态变量的有效值或状态转换上的各种约束条件,就需要借助原子性和封装性。
说的更简略些是Java线程安全都是因为共享变量,共享变量后会因为多个线程同时修改导致不正确的问题,所以收集一共有多少处会涉及到这些需要同步的变量,只有收集说有可能出问题的因素基于此之上保证所有元素线程安全也才能保证程序是线程安全的。
2. 依赖状态的操作
先验条件是值满足某个条件之后才能进行处理。例如:首先判断一个队列是否为空,如果为空。。。,如果不为空。。。其中判断队列是否为空就是先验条件。
如果在某个操作中包含有基于状态的先验条件,那么这个操作就称为依赖状态的操作。
? 满足可见性就可以?
3. 状态的所有权
单独一个基本对象比较保证其安全性,但是如果是包含对象的集合(容器类 例如:ArrayList),容器类通常表现出一种“所有权分离”的形式。
即使用线程安全的容器类(Collections.synchronizedList(List)),也只能保证容器相关的操作是线程安全的,如果发布了可变对象的引用,就不会拥有独占的控制权。(非线程安全)
二、实例封装
将数据封装在对象内部,可以将数据的访问限制在对象的方法上,从而更容易确保线程在访问数据时总能持有正确的锁。
封闭机制更易于构造线程安全的类,因为当封闭类的状态时,在分析类的线程安全性时就无须检查整个程序。
即使封闭能保证对象内所有处理都是现成安全的,但是还需要注意当对象发布后还是可能出现问题,例如HashSet 除保证Persion是线程安全外,还需要保证使用它的Set集合是线程安全的。
- 例子 对象中仅有一个变量,保证此变量线程安全。在方法上使用synchronized
1. Java监听器模式
synchronized通过指定对象锁定
2. 示例:车辆追踪
- 保证容器类实例、容器类包含元素实例线程安全。
三、线程安全性的委托
. 实例讲诉如何保证集合类及其包含类线程安全性
. 在现有的线程安全类中添加功能
继承自当前集合类,加锁使添加的方法保证安全性,但是这样比较脆弱。
组合方式,查看书籍源码
. 将同步策略文档化
以上就是我推荐给Java开发者们的一面试经典知识。但是这些知识里面并没有太多Java全栈、Java晋阶、JAVA架构之类的题,不是我不推荐,而是希望大家更多的从基本功做起,打好基础,太多复杂的内容一会儿也说不明白。
好了同学们,我能介绍的也都全部介绍完给你们了,如果下获得更多JAVA教学资源,可以选择来我们这里共同交流,群:240448376,很多大神在这里切磋学习,不懂可以直接问,晚上还有大牛免费直播教学。
注:加群要求
1、具有一定工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加,有些应届生和实习生也可以加。
2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加。
3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加。
4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。
5.阿里Java高级大牛直播讲解知识点,分享知识,多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!
PS:现在主要讲解的内容是(反射原理、枚举原理与应用、注解原理、常用设计模式、正规表达式高级应用、JAVA操作Office原理详解、JAVA图像处理技术,等多个知识点的详解和实战)
6.小号或者小白之类加群一律不给过,谢谢。
最后,每一位读到这里的网友,感谢你们能耐心地看完。觉得对你有帮助可以给个喜欢!希望在成为一名更优秀的Java程序员的道路上,我们可以一起学习、一起进步