文档章节

身为JAVA工作者必须了解的知识(三)

 叶荷
发布于 2017/08/27 19:46
字数 1428
阅读 1
收藏 0

一、设计线程安全的类

在设计线程安全类的过程中,需要包含以下三个基本要素:

. 找出构成对象状态的所有变量。

. 找出约束状态变量的不变性条件。

. 建立对象状态的并发访问管理策略。

分析对象的状态,首先从对象的域开始。 变量按作用域划分:

. 全局变量

. 局部变量

. 方法行参

. 异常处理参数

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程序员的道路上,我们可以一起学习、一起进步

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 24
码字总数 41519
作品 0
fbf的书单,欢迎分享,欢迎更新

本人看过的以下书值得推荐的,列出来的就是值得推荐的 这个颜色是一般推荐 这个颜色是强烈推荐 这个颜色是神作,收藏吧 物联网:生产力的变革 李虹著 开拓视野,一般 源码中国:全球IT外包新原...

fbf
2015/03/16
0
0
少走弯路,给Java 1~5 年程序员的建议

今天LZ是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容甚至是一些书籍。这一部分的内容,同样适用于一些希望转行到Java的同学。 在大家看之前,LZ要先声...

重走Java
05/29
0
0
Java程序员编程学习—Java新手职业生涯规划分享

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰
05/17
0
0
RabbitMQ入门(2)--工作队列

工作队列 (使用Java客户端) 在这第一指南部分,我们写了通过同一命名的队列发送和接受消息。在这一部分,我们将会创建一个工作队列,在多个工作者之间使用分布式时间任务。工作队列(亦称:任...

-悟空-
2015/02/24
0
8
Java编程基础知识点和技术点归纳

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰
05/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JS:异步 - 面试惨案

为什么会写这篇文章,很明显不符合我的性格的东西,原因是前段时间参与了一个面试,对于很多程序员来说,面试时候多么的鸦雀无声,事后心里就有多么的千军万马。去掉最开始毕业干了一年的Jav...

xmqywx
今天
0
0
Win10 64位系统,PHP 扩展 curl插件

执行:1. 拷贝php安装目录下,libeay32.dll、ssleay32.dll 、 libssh2.dll 到 C:\windows\system32 目录。2. 拷贝php/ext目录下, php_curl.dll 到 C:\windows\system32 目录; 3. p...

放飞E梦想O
今天
0
0
谈谈神秘的ES6——(五)解构赋值【对象篇】

上一节课我们了解了有关数组的解构赋值相关内容,这节课,我们接着,来讲讲对象的解构赋值。 解构不仅可以用于数组,还可以用于对象。 let { foo, bar } = { foo: "aaa", bar: "bbb" };fo...

JandenMa
今天
1
0
OSChina 周一乱弹 —— 有人要给本汪介绍妹子啦

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享水木年华的单曲《中学时代》@小小编辑 手机党少年们想听歌,请使劲儿戳(这里) @须臾时光:夏天还在做最后的挣扎,但是晚上...

小小编辑
今天
18
4
centos7安装redis及开机启动

配置编译环境: sudo yum install gcc-c++ 下载源码: wget http://download.redis.io/releases/redis-3.2.8.tar.gz 解压源码: tar -zxvf redis-3.2.8.tar.gz 进入到解压目录: cd redis-3......

hotsmile
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部