学习笔记《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; ...
随机推荐
- mysql com.mysql.cj.jdbc.Driver 配置
需配置时区 例如 url jdbc:mysql://127.0.0.1/sell?serverTimezone=Hongkong&useUnicode=true&characterEn ...
- log4j 2.+框架
今天听网友介绍说Log4j2说效率比lOG4J高而且敲级好用.晚上有空就花了几个时间研究了一下.发现嗯,的确好用.我还清楚的记得Log4j1.2的时候我们需要设置log4j需要通过一个properti ...
- React native 中使用Fetch请求数据
一.代码 import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Text, View } from ' ...
- @RequestParam 和 @ PathVariable 的区别
@RequestParam 和 @ PathVariable 的区别http://localhost:8080/Springmvc/user/page.do?pageSize=3&pageNo ...
- 【EMV L2】2CS.001.00 ~ 2CS.007.00
测试case要求,对于T=0和T=1卡,命令中是否存在Le是有差异的: - Select: Mandatory Command00 A4 04 00 Lc Command Data LeLc = 05 ...
- jmeter链接数据库
1.下载jar包“mysql-connector-java-8.0.12”包放入lib文件中 2.启动jemeter,添加线程组 3.在线程组下添加 JDBC Connection Configura ...
- window下mysql创建库只读
window下mysql创建库只读和启动失败都有可能是my.ini配置文件出错的问题 遇到如下错误ERROR 1036 (HY000): Table 'schemata' is read only,办 ...
- android 版本更新适配8.0,解决8.0手机无法更新自动安装apk
随着android 7.0的普及android 8.0的也逐渐流行起来,那么google对权限方面又有了新的修改.而且我发现在android8.0中除了一些bug,比如说:在小米6(Android 8 ...
- 安卓APP性能测试的一些方面
1. 启动速度 2. 点击/滑动等事件响应速度 3. 下载速度 4. 界面流畅程度,比较帧率 5. 耗电量测试 6. 流量测试 7. 内存泄漏 8. CPU 9. Monkey adb -s FJH5 ...
- vue项目localhost可以访问 ip不能访问
解决方法: 如图所示: