1. 公平锁,线程排序执行,防饿死应用场景

公平锁原则必须按照锁申请时间上先到先得的原则分配机制场景;

1).实现逻辑 上(包括:软件中函数计算、业务先后流程;硬件中操作实现中顺序逻辑)的顺序排队机制的场景;
软件场景:用户交互View中对用户输入结果分析类,分析过程后面算法依赖上一步结果的场景,例如:推荐算法实现[根据性别、年龄筛选]、阻塞队列的实现;

硬件场景:需要先分析确认用户操作类型硬件版本或者厂家,然后发出操作指令;例如:自动售货机;

2).现实 生活中 时间排序的 公平原则:

例如:客服分配,必须是先到先服务,不能出现饿死现象;公平锁实现见上文:

公平锁与非公平锁的测试demo:逻辑代码实现那就没法子实现了;

阻塞队列的实现就是时间上的公平原则。

2. 非公平锁,效率的体现者

实际开发中最常用的的场景就是非公平锁,ReentrantLock无参构造默认就时候非公平锁;适应场景除了上面公平锁中提到的其他都是非公平锁的使用场景;

3. ReentrantLock.Condition线程通信

ReentrantLock.Condition线程通信是最长见的面试题,这里以最简单例子:两个线程之间交替打印 26英文字母和阿拉伯数字为demo:

private void alternateTask() {ReentrantLock lock = new ReentrantLock();Condition condition1 = lock.newCondition();Condition condition2 = lock.newCondition();Thread thread1 = new Thread(() -> {try {lock.lock();for (int i = 65; i < 91; i++) {System.out.println("----------thread1------- " + (char) i);condition2.signal();condition1.await();}condition2.signal();} catch (Exception e) {} finally {lock.unlock();}});Thread thread2 = new Thread(() -> {try {lock.lock();for (int i = 0; i < 26; i++) {System.out.println("----------thread2------- " + i);condition1.signal();condition2.await();}condition1.signal();} catch (Exception e) {} finally {lock.unlock();}});thread1.start();thread2.start();}

4.同步功能的使用

实现线程同步锁synchronized 功能【单例为例】

  private Singleton() {}private static Singleton instance;private static Lock lock = new ReentrantLock();public static Singleton getInstance() {lock.lock();try {if (instance == null) {instance = new Singleton();}} finally {lock.unlock();}return instance;}

5. 中断杀器应用

ReentrantLock中lockInterruptibly()和lock()最大的区别就是中断相应问题:

lock()是支持中断相应的阻塞试的获取方式,因此即使主动中断了锁的持有者,但是它不能立即unlock(),仍然要机械版执行完所有操作才会释放锁。

lockInterruptibly()是 优先响应中断的,这样有个优势就是可以通过tryLock()、tryLock(timeout, TimeUnit.SECONDS)方法,中断优先级低的Task,及时释放资源给优先级更高的Task,甚至看到网上有人说可以做防止死锁的优化;

 ReentrantLock lock = new ReentrantLock();try {lock.lockInterruptibly();if (lock.tryLock(timeout, TimeUnit.SECONDS)) {//TODO}else{//超时直接中断优先级低的TaskThread.currentThread().interrupt();lock.lock();//TODO}} catch (InterruptedException e) {e.printStackTrace();} finally {

6. 非重要任务Lock使用

优先级较低的操作让步给优先级更高的操作,提示代码效率/用户体验;忽略重复触发

1).用在定时任务时,如果任务执行时间可能超过下次计划执行时间,确保该有状态任务只有一个正在执行,忽略重复触发。

2).用在界面交互时点击执行较长时间请求操作时,防止多次点击导致后台重复执行(忽略重复触发)。

以上两种情况多用于进行非重要任务防止重复执行,(如:清除无用临时文件,检查某些资源的可用性,数据备份操作等)

tryLock()功能:如果已经获得锁立即返回fale,起到防止重复而忽略的效果

ReentrantLock lock = new ReentrantLock();//防止重复执行,执行耗时操作,例如用户重复点击if (lock.tryLock()) {try {//TO DO} finally {lock.unlock();}}

超时放弃

定时操作的例如:错误日志、定时过期缓存清理的操作,遇到优先级更高的操作占用资源时,暂时放弃本次操作下次再处理,可以起到让出CPU,提升用户体验;

  ReentrantLock lock = new ReentrantLock();try {if (lock.tryLock(timeout, TimeUnit.SECONDS)) {//TO DO}} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}

Java多线程 - ReentrantLock实际开发中的应用场景相关推荐

  1. Java在游戏服务器开发中的应用

     Java在游戏服务器开发中的应用 width="22" height="16" src="http://hits.sinajs.cn/A1/we ...

  2. java backbone_[Java教程]移动前端开发中的Backbone之一:Backbone中的模型和集合

    [Java教程]移动前端开发中的Backbone之一:Backbone中的模型和集合 0 2015-09-24 17:00:04 当我们开发含有大量Javascript的web应用程序时,首先你需要做 ...

  3. 038——VUE中组件之WEB开发中组件使用场景与定义组件的方式

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

  4. Redis在实际开发中的运用场景

    1.什么是Redis? Redis是一款基于内存的键-值型NoSQL数据库.NoSQL - 非关系型数据库 特点:可以进行快速的数据读写,官方数据 11W/s 读 8W/s 写. redis读写很快是 ...

  5. JAVA的嵌入式脚本开发(中)

    本文将分以下几个小节来学习: Java的JavaScript脚本引擎 脚本开发中涉及到的类和接口简介 开发步骤 脚本与java数据传递 脚本执行上下文 作用域 方法的调用 编译脚本 脚本与java数据 ...

  6. java多线程 线程安全_Java中的线程安全

    java多线程 线程安全 Thread Safety in Java is a very important topic. Java provides multi-threaded environme ...

  7. java静态引用_Java开发中静态方法引用和实例方法引用案例详细讲解

    Java开发 前言 在Java的日常开发中静态方法引用和实例方法引用在很多地方都会用到,可以说是万金油,但是你真的掌握了吗?下面就由小编给大家做一个比较细想的讲解,废话不多说现在开始把. 正文 大家对 ...

  8. acm竞赛java很少,Java多线程在ACM竞赛中的应用

    欢迎转载,转载请注明出处. 转发注记:网上看到有少数人讨论过在ACM竞赛中使用多线程,但是在Online Judge上一般是不支持的.因为Online Judge都会限制CPU的使用权限,所以即使可以 ...

  9. 微信信息回复 java,微信公众平台开发中使用Java如何实现一个消息回复功能

    微信公众平台开发中使用Java如何实现一个消息回复功能 发布时间:2020-11-17 16:11:11 来源:亿速云 阅读:82 作者:Leah 本篇文章给大家分享的是有关微信公众平台开发中使用Ja ...

最新文章

  1. git 打tag_图文讲解,团队开发中的 Git 最佳实践
  2. SAP 谈谈PFCG创建ROLE后打包产生TR
  3. i卡来了!英特尔公布游戏独显出货时间表,放话今年要卖400万张
  4. OpenCV中的数据结构
  5. 利用PyCaret的力量
  6. realloc函数使用总结
  7. MySQL 基础 ———— SAVEPOINT 的应用
  8. 强化学习《基于策略价值 - Actor-Critic》
  9. [转] 如何看透一个人
  10. 全面剖析Linux库文件路径的添加
  11. Confluence 6 重构索引缓慢
  12. Android使用DatePickerDialog日期控件使用主题android:Theme.Holo.Light.Dialog有白边的问题解决
  13. OpenHarmony学习笔记——南向开发环境搭建
  14. 2021年江苏省高考成绩排名查询,2021年江苏高考个人成绩排名查询方法及排名查询系统...
  15. android 卡片投影渐变,受Duolingo启发的ViewPager卡片效果
  16. linux测试ping值,网站全国各地Ping值测试|在线ping工具—卡卡网 www.webkaka.com
  17. 电脑裸妆linux,美妆相机pc版 版本 V5.0.0
  18. C#,打印漂亮杨辉三角形(帕斯卡三角形)的源代码
  19. 【视觉SLAM十四讲】第三讲 三维空间刚体运动
  20. Python实现课堂随机提问并语音播报学生姓名!辅导员开心极了!

热门文章

  1. java 调用 docker 中的 HBase 服务 卡死 不报错 不报异常 卡着不动 但 服务ip是能ping通
  2. 如何解决excel打印预览不可用的问题
  3. 【selenium3+JAVA】界面自动化测试教程(一)——浏览器的启动之IE浏览器的启动
  4. HDR Imaging--Digital Overlap
  5. iPad中键盘隐藏有6个虚拟键
  6. 模仿天猫网站-前端项目
  7. 使用Apache文件上传控件实现文件上传
  8. protobuf语法详解
  9. 程序员不可忽视的事——使用电脑注意事项
  10. 游戏或将成为元宇宙新的突破口