学习笔记《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; ...
随机推荐
- Raspberry Pi 安装配置 Home Assistant
家庭助理(Home Assistant)是一款基于 Python 的智能家居开源系统,支持众多品牌的智能家居设备,可以轻松实现设备的语音控制.跟踪和控制家里的所有设备, 并自动化控制,能完美的运行在树 ...
- python3+cv2+andiord安卓摄像头
#coding=utf-8import cv2 import time if __name__ == '__main__': cv2.namedWindow("camera",1) ...
- 一些面试题(关于string的)
一些常见的面试题: String a = "hello2"; String b = "hello" + 2; System.out.println(a == b ...
- react-native-printer
react-native-printer A React Native Library to support USB/BLE/Net printer for Android platform Inst ...
- jmeter中提取json串
https://blog.csdn.net/zha6476003/article/details/80295068
- 微信小程序之跳转、请求、带参数请求小例子
wx.request(OBJECT) wx.request发起的是 HTTPS 请求.一个微信小程序,同时只能有5个网络请求连接. 具体参数说明参看微信小程序官方文档-发起请求. 例: //当页面加载 ...
- 在java代码中控制UI界面
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle saved ...
- initWithFrame方法的使用
1. initWithFrame方法是什么? initWithFrame方法用来初始化并返回一个新的视图对象,根据指定的CGRect(尺寸). 当然,其他UI对象,也有initWithFrame方法, ...
- Ex0203
游戏 – 这些软件的开发者是怎么说服你(陌生人)成为他们的用户的?他们的目标都是盈利么?他们的目标都是赚取用户的现金么?还是别的? 朋友们都在玩,我在试玩的时候也觉得很不错:游戏基本上的目标都 ...
- python excle写数据
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/4/24 10:30 # @File : Excle写.py # @Softw ...