当前课程知识点:JAVA程序设计进阶 >  第三章 线程(下) >  3.3 线程的安全实现-非阻塞同步 >  Video

返回《JAVA程序设计进阶》慕课在线视频课程列表

Video在线视频

Video

下一节:Video

返回《JAVA程序设计进阶》慕课在线视频列表

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

这样一个本身

就是线程安全的这个类

就能够保证你的

整个这个代码达到线程安全的目的

所以这一节内容我们就讲到这里

JAVA程序设计进阶课程列表:

第一章 线程(上)

-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

第六章 Java虚拟机

-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

第七章 深入集合Collection

-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

Video笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。