学习笔记《Java多线程编程实战指南》四
JAVA线程同步机制
线程同步机制:是一套用于协调线程间的数据访问及活动的机制,该机制用于保障线程安全以及实现这些线程的共同目标。java平台提供的线程同步机制包括锁、volatile关键字、final关键字、static关键字以及一些相关的API。
4.1锁概述
将多个线程对共享数据的并发访问转化成串行访问,即一个共享数据一次只能被一个线程访问,该线程访问结束后其他线程才能对其进行访问。锁就是利用这种思路以保障线程安全的线程同步机制。可以把锁理解成对共享数据保护的许可证。
一个线程在访问共享数据前必须申请相应的锁(许可证),一个线程获得某个锁,我们就称该线程为相应锁的持有线程。锁的持有线程在其获得锁之后和释放锁之前这段时间内所执行的代码被称为临界区。如果有多个线程访问同一个锁所保护的共享数据,那么我们就称这些线程同步在这个锁上。
锁具有排他性,即一个锁一次只能被一个线程持有,这种锁被称为排它锁或者互斥锁。读写锁是对排它锁的一种相对改进。
java平台中的锁包括内部锁和显示锁。内部锁是通过synchronized关键字实现的,显示锁是通过java.concurrent.locks.Lock接口的实现类。
锁能够保护共享数据以实现线程安全,作用包括保障原子性、保障可见性和保障有序性。
1.保障原子性:锁通过互斥,就是指一个锁一次只能被一个线程持有。在临界区所执行的代码具备了不可分割的特性。
2.保障可见性:锁的获得隐含着冲刷处理器缓存这个动作,锁的释放隐含着冲刷处理器缓存这个动作。
3.保障有序性:读线程对这些操作的感知顺序与源代码顺序一致。
4.2可重入性
如果一个线程持有一个锁的时候还能够继续成功申请该锁,那么我们就称该锁是可重入的。否则我们就称该锁为非可重入的。
4.3内部锁:synchronized关键字
synchronized关键字可以用来修饰方法以及代码块。synchronized关键字修饰的方法就被称为同步方法,synchronized修饰的静态方法就被称为同步静态方法,synchronized修饰的实例方法就被称为同步实例方法。
4.4显示锁:Lock接口
显示锁是java.util.concurrent.locks.Lock接口的实例。
| void | locak() 获取锁 |
| void | lockInterruptibly() 如果当前线程未被中断,则获取锁。 |
| Condition | new Condition() 返回绑定到此Lock实例的新Conditon实例。 |
| boolean | tryLock() 仅在调用是锁为空闲状态才获取该锁。 |
| boolean | tyrLock(long time ,TimeUnit unit) 如果锁在给定的等待时间内空闲,并且当前线程未被中断,则获取锁。 |
| void | unlock() 释放锁。 |
显示锁的使用包括以下几个方面:
- 创建Lock接口实例。Lock lock = new ReentrantLock(),
- 在访问共享数据前申请相应的显示锁。 lock.lock()
- 在临界区中访问共享数据。
- 共享数据访问结束后释放锁。lock.unlock()
学习笔记《Java多线程编程实战指南》四的更多相关文章
- 干货 |《从Lucene到Elasticsearch全文检索实战》拆解实践
1.题记 2018年3月初,萌生了一个想法:对Elasticsearch相关的技术书籍做拆解阅读,该想法源自非计算机领域红火已久的[樊登读书会].得到的每天听本书.XX拆书帮等. 目前市面上Elast ...
- 《从Lucene到Elasticsearch全文检索实战》的P184页
curl -XPOST "http://localhost:9200/_bulk?pretty" --data-binary @books.json 这句话在书中是以crul的命令 ...
- LinQ实战学习笔记(四) LINQ to Object, 常用查询操作符
这一篇介绍了下面的内容: 查询object数组 查询强类型数组 查询泛型字典 查询字符串 SelectMany 索引 Distinct操作符 排序 嵌套查询 分组 组连接 内连接 左外连接 交叉连接 ...
- Redis in Action : Redis 实战学习笔记
1 1 1 Redis in Action : Redis 实战学习笔记 1 http://redis.io/ https://github.com/antirez/redis https://ww ...
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
- IOS学习笔记(四)之UITextField和UITextView控件学习
IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...
- java之jvm学习笔记四(安全管理器)
java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(四) indigo devices
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Typescript 学习笔记四:回忆ES5 中的类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- ES6学习笔记<四> default、rest、Multi-line Strings
default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...
随机推荐
- springboot+ibatis 多数据源配置
这个是boot基本版本包,因为我用的打包方式是war所以去除掉了boot内置的tomcat,但是为了方便测试又引入了内置tomcat,只要添加<scope>provided</sco ...
- ul li data-* 数据的读取
<ul class="questions"> <li> <div class="question">1.您的年龄是?< ...
- AOP的第一个小坑
今天看项目源码,看到Service类继承了一个SelfProxy类,这个类实现了一个叫self()的方法,用于返回动态代理生成的实例. 为什么要返回实例呢,因为有的时候类内部需要调用自身的public ...
- Linux 驱动——Button驱动7(Timer)消抖
button_drv.c驱动文件: #include <linux/module.h>#include <linux/kernel.h>#include <linux/f ...
- xcode10 出现iPhone has denied the launch request
一般的处理这里不介绍,只要介绍因为证书的问题导致这个原因的.我的现象是,模拟器可以,iOS12以下设备可以,证书全部更新了一遍,只有一个没更新,还真是那个没更新的问题. 从钥匙串查看自己的证书配置,看 ...
- 刷新浏览器 protractor
//refresh browser.ignoreSynchronization = true; browser.refresh(); browser.sleep(3000); browser.swit ...
- java中的i++与++i的区别以及除法、模的用法(基础)
java中i++与++i的区别: 例如:int i=3; (先运算再赋值)j=++i; i的值先变成4,再赋给j,j的值为4: (先赋值再运算)j=i++; 先将i的值3赋给j,j的值为3,然后i变成 ...
- [转]CentOS7利用systemctl添加自定义系统服务
原文:https://www.cnblogs.com/saneri/p/7778756.html CentOS7自定义系统服务 CentOS7的服务systemctl脚本存放在:/usr/lib/sy ...
- DG Switch over
DG切换迁移Switch over切换文档 本篇文档,整体结构:1.切换前检查确认2.DG切换角色操作3.切换后检查确认 目录:一.切换前检查确认1.数据库版本2.DG架构,IP信息及切换角色前后3. ...
- 热更新-----为何使用lua进行热更
事实上我们在安卓端是可以使用c#jit的,但是我们在ios上的代码是AOT(预先编译,静态编译)的,不能用c# jit(实时编译,即时编译). ios不能用c#热更是因为启动了CPU的No eXecu ...