2019独角兽企业重金招聘Python工程师标准>>>

Java锁分类

  • 公平锁:线程获取锁的顺序是按照线程加锁的顺序分配,FIFO
  • 非公平锁:获取锁的抢占机制,是随机获取锁的,一般由OS统一调度

ReentrantLock:可重入互斥锁

ReentrantLock由最近成功获取该锁的线程所有,直到该线程释放该锁其他的线程才可获取

可重入互斥锁解释:可重入的意思是当线程进入同步代码内部时,当在同步代码内部访问另外的同步方法,线程会自动获取另外同步方法的锁,换句话说当线程获取一个同步代码的锁时,可以自由访问其他的同步代码

可重入特性本质:线程执行同步代码时自动获取到共享对象的监视器,只要是目标对象监视器作用范围该线程都可完全访问,线程执行完同步代码则释放监听器,其他线程获取监视器才可以访问,类似当司机拿着道路通行证可以自由使用通行证规定的路段,通行证类比对象的监视器,司机离开路段,将通行证转给另外一个司机,同外一个司机也可以享受同样的服务(假设道路通行证不实名制)

特点:Lock锁对象可完全取代synchronized功能,并且更加灵活


Lock的基础应用:

测试类

public class LockDetail {/*** 对象属性为Lock对象:static所有类实例共享* new ReentrantLock(false); 默认非公平锁/true表示公平锁*/
private static Lock lock = new ReentrantLock();public void show(String name) {try {lock.lock();for (int i = 0; i < name.length(); i++) {Thread.sleep(1000);System.out.println(Thread.currentThread().getName() + ":" + name.charAt(i));}} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}
}
}

测试代码

LockDetail lockDetail01 = new LockDetail();
LockDetail lockDetail02 = new LockDetail();for(int i=0;i<10;i++){new Thread() {  public void run() {  lockDetail01.show("abcdefghijklmn");  };  }.start();  new Thread() {  public void run() {  lockDetail02.show("abcdefghijklmn");  };  }.start();
}

效果


读写锁:ReentrantReadWriteLock

特点:允许多个线程同时读,不允许同时写

读写锁测试类

class DefineLock {// 创建读写锁:读锁可以同时读,一个读一个写,不能两个同时写
ReadWriteLock lock = new ReentrantReadWriteLock();int data = 0;public void write() {lock.writeLock().lock(); // 线程绑定写锁this.data = new Random().nextInt(5000);System.out.println(Thread.currentThread().getName() + ":准备写入数据");System.out.println(Thread.currentThread().getName() + ":写入数据:" + data);System.out.println(Thread.currentThread().getName() + ":写入完成");System.out.println("------------------------");lock.writeLock().unlock(); // 线程解除写锁
}public void read() {lock.readLock().lock(); // 线程绑定读锁System.out.println(Thread.currentThread().getName() + ":准备读取数据");System.out.println(Thread.currentThread().getName() + ":读取数据:" + data);System.out.println(Thread.currentThread().getName() + ":准备读取数据");System.out.println("-------------------------");lock.readLock().unlock(); // 线程绑定读锁
}
}

读写锁测试代码

DefineLock lockTest = new DefineLock();for (int i = 0; i < 20; i++) {boolean flag = (new Random().nextInt()%2 == 0);new Thread(new Runnable() {public void run() {if(flag){                   lockTest.write();}else{lockTest.read();}}}).start();}}

效果

分析 日志可看出每次写入的数据都是不同的,不同的读取线程读取到的数据可能是相同的,一定程度可以说明多个线程读和一个线程写的读写锁的特性,当然可以将读取的过程用sleep分割开,如果看到读取线程交替就直接证明多线程读和单线程写的特性

可重入锁特性测试

测试类

public class Test {Lock lock = new ReentrantLock();public void show1(String str) throws InterruptedException{lock.lock();for(int i = 0; i < str.length(); i++){System.out.println(Thread.currentThread().getName()+":show1:" + str.charAt(i));Thread.sleep(100);}show2(str);lock.unlock();
}public void show2(String str) throws InterruptedException{lock.lock();for(int i = 0; i < str.length(); i++){System.out.println(Thread.currentThread().getName()+":show2:" + str.charAt(i));Thread.sleep(500);}lock.unlock();
}public static void main(String[] args) {Test test = new Test();String str = "abcdefge";for(int i = 0; i < 20; i++){new Thread(new Runnable() {@Overridepublic void run() {try {test.show1(str);} catch (InterruptedException e) {e.printStackTrace();}}}).start();}
}
}

效果:

剖析: 控制台输出可以看出每次都是单一线程执行完方法涉及到的同步代码后另外一个线程才可访问,直接证明可重入的特性

转载于:https://my.oschina.net/yangzhiwei256/blog/3017258

【Thread】- ReentrantLock、ReentrantReadWriteLock相关推荐

  1. Java线程安全Lock、ReentrantLock、ReentrantReadWriteLock

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/120750932 本文出自[赵彦军的博客] Java线程安全StampedLock ...

  2. 【进阶】 --- 多线程、多进程、异步IO实用例子

    [进阶] --- 多线程.多进程.异步IO实用例子:https://blog.csdn.net/lu8000/article/details/82315576 python之爬虫_并发(串行.多线程. ...

  3. 【海思篇】【Hi3516DV300】二、使用串口烧写映像

    目的:将上一章节编译出的映像文件烧写到板子上:让更多的爱好者了解海思.加入海思. 目录 1 准备工作 2 开始烧写 3 配置启动参数 4 结果 1 准备工作 1)准备海思工具HiTool.exe,启动 ...

  4. 【SpringBoot】72、SpringBoot中接入轻量级分布式日志框架Graylog

    1.Graylog简介 Graylog 是一个开源的日志聚合.分析.审计.展现和预警工具.在功能上来说,和 ELK 类似,但又比 ELK 要简单很多.依靠着更加简洁,高效,部署使用简单的优势很快受到许 ...

  5. 【网络通信】select、poll、epoll

    [网络通信]select.poll.epoll 目录 [网络通信]select.poll.epoll 前言 0. 网络编程基础原理 1 网络编程(Socket)概念 一.BIO (Blocking I ...

  6. 【RocketMQ】4、Windows10单机环境部署

    [RocketMQ]4.Windows10单机环境部署 文章目录 [RocketMQ]4.Windows10单机环境部署 一.RocketMQ下载 二.环境搭建 三.启动RocketMQ 四.图形管理 ...

  7. 3.1_15 JavaSE入门 P14 【多线程】同步、匿名内部类、死锁、生命周期

    相关链接 Excel目录 目录 P14 [进阶]多线程.同步.匿名内部类.死锁.生命周期 1 概述 1.1 并行&并发 1.2 主方法是多线程的吗? 2 多线程实现 2.1 方式一:继承Thr ...

  8. 【并发】ReentrantLock中公平锁和非公平锁的理解

    [前言] ReentrantLock 是在JavaSE5之后,并发包中新增了Lock接口用来实现锁功能,它提供了与synchronized关键字类似的同步功能.同时ReentrantLock也是重入锁 ...

  9. 【JavaSE】day03_Date、SimpleDateFormat、Calendar、Collection

    [JavaSE]day03_Date.SimpleDateFormat.Calendar.Collection 1.Date及其经常使用API 1)JAVA 中的时间 Java中的时间使用标准类库的D ...

最新文章

  1. Python中的 __name__属性的含义和作用
  2. ---WebCam网络摄像头9 usb dirver
  3. 告别DNS劫持,一文读懂DoH
  4. linux常用高级命令,Linux常用高级文件操作命令
  5. python绘制动画示例_Python使用matplotlib绘制动画的方法
  6. 快递扫地机器人被损坏_手机动一动,全屋扫干净:石头T4扫地机器人体验记
  7. python使用try语句捕获处理异常_Python使用try except处理程序异常的三种常用方法分析...
  8. html如何添加隶书字体,word如何添加隶书字体?
  9. 基于Vue2.0仿Element UI的el-tooltip实现一个气泡框组件,支持多数据类型的显示和内容为空时不显示气泡框
  10. js重力感应小球游戏
  11. Pair project(刘昊岩11061156 黄明源11061186)
  12. cerebro安装部署
  13. day11 反转字符串||反转字符串2
  14. java/php/net/python线上歌唱比赛报名系统设计
  15. 学校校园学生寝室管理查寝打分系统 毕业设计毕设源码毕业论文开题报告参考(4)网站和学生功能
  16. 电源滤波电容如何选择
  17. html活动链接是什么意思,什么是活动型链接诱饵
  18. 做一个laravel框架下的系统日志
  19. 北斗三号b1c频点带宽_北斗三号B1C信号捕获技术研究
  20. c++小游戏(附源码)(可转载)

热门文章

  1. 使用扩展的 CodeIgniter 框架实现 RESTful 框架
  2. 使用Lucene2.3构建搜索引擎
  3. 《潮流时装设计——世界顶级时装CAD制板技巧》——1.6 服装生产中各部位国际代号...
  4. linux IP地址设置方式 centos6.5
  5. perl:正则表达式部分
  6. 高效编程所需要做的14件事
  7. CSS+DIV-制作实用菜单
  8. 安装截图软件shutter
  9. intellij idea 生成可执行jar 运行提示没有主清单属性
  10. 牛客寒假6-B.煤气灶