当前课程知识点:JAVA程序设计进阶 > 第三章 线程(下) > 3.3 线程的安全实现-非阻塞同步 > Video
这一节我们将介绍
线程安全的第二种实现方式
非阻塞同步
那在介绍非阻塞同步之前
所相对应的就是阻塞同步
那我们互斥同步存在的问题
就是进行线程阻塞
和唤醒所带来的性能问题
拉这种同步我们称之为阻塞同步
那在刚才我们介绍当中通过synchronize
实际上它就是一种
这个阻塞同步的这种实现方式
那这种方式另外一种名字
就叫做悲观并发策略
也就是说我比较悲观
一定要做一个非常
强制的强烈的一种互斥
来去达到我同步的这个目标
那与之相对应就非阻塞同步
那它不同于悲观并发策略
而是使用基于冲突
检测的乐观并发策略
那它就是说我先进行操作
如果没有其他线程
来去征用这些共享数据
那我这种操作就成功了
那否则呢我就产生了冲突
一旦产生冲突我就采取不断重试
直到成功为止的这种策略
那这种策略它不需要把线程挂起
这样的话它相对效率就比较高
所以我们把它
就称作为非阻塞同步
那要实现非阻塞同步的话
最好得有硬件处理器指令的支持
那目前我们硬件处理器指令的话
它有一些这个相应的指令
可以支撑我们去实现非阻塞同步
比如说有一种指令叫测试并设置
就是Test and Set
或者是获取并增加
就是Fetch and Increment
另外一种这个指令就是交换Swap
还有另外一种就叫比较并交换
Compare and Swap
经常被简写为CAS
那另外一些指令
就是加载链接或者调整存储
英文就是Load-Linked
或者Store-conditional
那可以简称为LL或者SC
那我们java当中有一些类
它已经是实现了
非阻塞同步的形式
那如果大家了解这些类的话
在你们写你们的程序的时候
可以考虑采用这些类
那下面我就给大家举一个例子
那我们现在
要写一个这个类用于计数
这个最简单的一个这个程序
class Counter
那Counter这个类里面呢
有一个成员变量
private valatileint count等于0
这个整形对象count
它的这个初始值是0
最主要的作用就是说用它来计数
那计数的话那肯定说
是要不停的往上加嘛 对不对
加1加1往上加
那我们看一下这个加1
这方法是怎么实现的
pulic synchronized void increment
那这个方法increment
就是要这个把我们的成员变量
count往上加1
那里面内容就count加加
当然这个方法
我们加了一个红色的字体
就是synchronized
就是给它做了一个这个锁的控制
要这个加一把锁
所以加了把锁
而再往下的话
就是public int getCount
然后就返回这个count的这个值
所以我们对于count的话
这么一个类
就是class count类的话
我们要把它实现那种技术系列
这种功能的话
我们是通过
对这个加1这个方法
来加上synchronized
达到我们的目的
这个有没有其他的实现方式呢
其实也可以有别的办法
我们用Atomiclnteger来去
替代我们刚才的
那个int类型的这个count方法
大家看这里class Counter
这个里面有private Atomiclnteger count
注意这个count这个对象
它的类型是Atomiclnteger
这个类是它的类型
那大家看等号右边
new Atomiclnteger我实例画
这么类的一个对象
好了再往下看怎么去实现加1
public void increment
count.incrementAndGet
大家看看在这里我实现加1的时候
我就increment方法有没有加了synchronized来修饰它并没有
并没有加这个synchronized修饰它
而直接往里面调了counts点incrementAnd Get这个方法
那其实大家也可以这么理解
也就是说我们对于这种线程安全
就是对我们这个
访问对象的线程安全的这种控制
不是放到我们当前count这个类
它的increment方法来去实现的
而是已经放到底下的那个类
就叫Atomiclnteger这个类来实现了
所以你就可以直接
去调用它的这个方法来去实现加1的这个功能
那整体上我们这个新的类
就class count
就是这个类通过
用Atomiclnteger来改进这类
它也是线程安全的
整体上也是线程安全的
只不过说当你写这个类的时候
你不需要考虑
自己去加上synchronized这样的同步互斥的这种实现方式
而是通过直接使用了Atomiclnteger
这样一个本身
就是线程安全的这个类
就能够保证你的
整个这个代码达到线程安全的目的
所以这一节内容我们就讲到这里
-1.0 导学
--Video
-1.1 线程的基本概念
--Video
-1.1 线程的基本概念--作业
-1.2 通过Thread类创建线程
--Video
-1.2 通过Thread类创建线程--作业
-1.3 线程的休眠
--Video
-1.3 线程的休眠--作业
-1.4 Thread类详解
--Video
-1.5 通过Runnable接口创建线程
--Video
-1.5 通过Runnable接口创建线程--作业
-1.6 线程内部的数据共享
--Video
-2.0 导学
--Video
-2.1 线程同步的思路
--Video
-2.2 线程同步的实现方式—Synchronization
--Video
-2.3 线程的等待与唤醒
--Video
-2.4 后台进程
--Video
-2.5 线程的生命周期与死锁
--Video
-2.6 线程的调度
--Video
-3.0 导学
--Video
-3.1 线程安全与线程兼容与对立
--Video
-3.2 线程的安全实现-互斥同步
--Video
-3.3 线程的安全实现-非阻塞同步
--Video
-3.4 线程的安全实现-无同步方案
--Video
-3.5 锁优化
--Video
-4.0 导学
--Video
-4.1 URL对象
--Video
-4.2 URLConnection对象
--Video
-4.3 Get请求与Post请求
--Video
-4.4 Socket通信原理
--Video
-4.5 Socket通信实现
--Video
-5.0 导学
--Video
-5.1 Socket 多客户端通信实现
--Video
-5.2 数据报通信
--Video
-5.3 使用数据报进行广播通信
--Video
-5.4 网络聊天程序
--Video
-6.0 导学
--Video
-6.1 Java虚拟机概念
--Video
-6.2 Java虚拟机内存划分
--Video
-6.3 Java虚拟机类加载机制
--Video
-6.4 判断对象是否存活算法及对象引用
--Video
-6.5 分代垃圾回收
--Video
-6.6 典型的垃圾收集算法
--Video
-6.7典型的垃圾收集器
--Video
-7.0 导学
--Video
-7.1 集合框架与ArrayList
--Video
-7.2 LinkedList
--Video
-7.3 HashMap与HashTable
--Video
-7.4 TreeMap与LinkedHashMap
--Video
-7.5 HashSet
--Video
-8.0 导学
--Video
-8.1 Java反射机制
--Video
-8.2 Java静态代理
--Video
-8.3 Java动态代理
--Video
-8.4 Java 反射扩展-jvm加载类原理
--Video
-8.5 Java进阶课程总结
--Video