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. 配置3层交换机VLAN间通信

    SW2 Switch>en Switch#conf t Enter configuration commands, one per line. End with CNTL/Z. Switch(c ...

  2. 移动端调用ArcGIS Server 10.1服务

    1.最好用mdb数据源,不要用shp文件作为数据源,一是属性字段长度超过5个字符会被截断,二是中文会变成乱码. 2.mxd的layer的坐标系要是WGS1984(4362),不然属性查询不出来.

  3. textview自定义跳转链接

    设置方式 ,主要是遍历html中的url,然后加一个自定义的跳转 private void setTextLink(String rule) { if(TextUtils.isEmpty(rule)) ...

  4. 【Effective Java读书笔记】创建和销毁对象(一):考虑使用静态工厂方法代替构造器

    类可以提供一个静态方法,返回类的一个静态实例,如Boolean包装类的一个获取实例的静态方法 public static Boolean valueOf(boolean b) { return (b ...

  5. SQLI DUMB SERIES-19

    (1)根据题意,从Referer入手 (2)报错注入与上一关相同.如爆库名: 'and extractvalue(1,concat(0x7e,(select database()),0x7e)) an ...

  6. vue+axios跨域解决方法

    通过这种方法也可以解决跨域的问题. 使用http-proxy-middleware 代理解决(项目使用vue-cli脚手架搭建) 例如请求的url:“http://f.apiplus.cn/bj11x ...

  7. Linux创建用户与权限赋值

    1.设置文件的权限 1).解说: d:是英语directory的缩写,表示“目录”.就是说这是一个目录. l:是英语link的缩写,表示“链接”.就是说这是一个链接. b:块设备文件 c:字符设备 s ...

  8. 利用Python中的for循环和while循环,打印各种方向的九九乘法表。

    哈喽大家好,今天,可乐来给大家分享一下Python中用for循环和while循环打印九九乘法表的操作.由于本人也是刚刚接触Python不长时间,代码也是自己编写的,所以有什么不足之处还请大家多多指教. ...

  9. response响应

    郭晨 软件151 1531610114 response1.response常用APIsetStatus:设置响应行当中的状态码setHeader:设置响应头信息getOutputStream:获得字 ...

  10. 记NOIP2018

    day0 中午在机房水了一波出发,坐了一下午的车,5点到了大门对面的红旗宾馆.南山中学的和我们住在一个宾馆里面,Z教练似乎同他们关系很好,见面还打招呼. 红旗宾馆附近特别偏僻,出门就是修路的工地,后面 ...