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多线程编程实战指南》四的更多相关文章

  1. 干货 |《从Lucene到Elasticsearch全文检索实战》拆解实践

    1.题记 2018年3月初,萌生了一个想法:对Elasticsearch相关的技术书籍做拆解阅读,该想法源自非计算机领域红火已久的[樊登读书会].得到的每天听本书.XX拆书帮等. 目前市面上Elast ...

  2. 《从Lucene到Elasticsearch全文检索实战》的P184页

    curl -XPOST "http://localhost:9200/_bulk?pretty" --data-binary @books.json 这句话在书中是以crul的命令 ...

  3. LinQ实战学习笔记(四) LINQ to Object, 常用查询操作符

    这一篇介绍了下面的内容: 查询object数组 查询强类型数组 查询泛型字典 查询字符串 SelectMany 索引 Distinct操作符 排序 嵌套查询 分组 组连接 内连接 左外连接 交叉连接 ...

  4. Redis in Action : Redis 实战学习笔记

    1 1 1 Redis in Action : Redis  实战学习笔记 1 http://redis.io/ https://github.com/antirez/redis https://ww ...

  5. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  6. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

  7. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  8. Learning ROS for Robotics Programming Second Edition学习笔记(四) indigo devices

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  9. Typescript 学习笔记四:回忆ES5 中的类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  10. ES6学习笔记<四> default、rest、Multi-line Strings

    default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...

随机推荐

  1. 关于SpringCloud配置网关转发时出现一下啊错误:“com.netflix.zuul.exception.ZuulException: Forwarding error at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.handleException”

    com.netflix.zuul.exception.ZuulException: Forwarding error at org.springframework.cloud.netflix.zuul ...

  2. python vtk 通过回调函数监测键盘”Up”键动作,每按一次方向上键,actor变换一种颜色

    import vtk class KeyPressInteractorStyle(vtk.vtkInteractorStyleTrackballCamera): def __init__(self,p ...

  3. element UI 下拉菜单滚动监听(vue指令)

    直接看代码吧,可以直接粘贴此代码到你的编辑器中看效果. <template> <div class="page-component"> <div cl ...

  4. ChIP-seq基本流程及工具

    ChIP-seq数据分析整理 1.Alignment 2.Peak detection 3.Peak annotation 1. GO analysis 2. Pathway analysis 4.D ...

  5. 埃式筛法——求n以内素数

    素数筛法的关键就在一个“筛”字.算法从小到大枚举所有数,对每一个素数,筛去它的所有倍数,剩下的就都是素数了. 例如:求1-15中的所有素数. 1.  2是素数(唯一需要事先确定的),因此筛去2的所有倍 ...

  6. Hadoop、Strom集群实现日志自动清理

    Hadoop+Storm集群,运行一段时间ZooKeeper等关键进程自动停止运行,经检测是系统磁盘不足 系统磁盘100%: 查找大文件后发现,空间均被ZooKeeper产生的log占用 find / ...

  7. 集合或数组转成String字符串

    1.将集合转成String字符串 String s=""; for (int i = 0; i < numList.size(); i++) { if (s=="& ...

  8. padding填充属性

    内边距属性: 设置元素的内容与边框之间的距离. 分4个方向(上右下左): padding-top padding-right padding-bottom padding-left 说明:值不能为负值 ...

  9. JAVA日常之三

    一.Main方法的args参数 args[] 是程序运行前可传入的参数,比如 java HelloWorld a,那么在HelloWorld的main方法里面 args就是{"a" ...

  10. 博客作业06--结构体&指针

    1.本章学习总结 1.1思维导图 1.2.本章学习体会 结构体突破了数组的局限,把不同类型有内在联系的数据汇聚成一个整体,这种新的构造数据类型,提供了更便利的手段,更好的实现代码功能.通过代码建立文件 ...