java 分布式同步锁_java编程进阶之路:回归锁的本质,探索分布式锁之源头
开篇引论
众所周知,现在分布式应用越来越广泛,尤其是现在随着"中台"的搭建,分布式显得尤为重要,小到关乎应用的性能,大到影响一个企业的未来。在现在这个互联网飞速发展的时代,如果你所在的企业还未能引入"中台"的概念,那么你可以考虑一下今后的打算了。就算你用不着为企业着想,也要为自己的职业生涯负责。
都知道现在分布式锁应用越来越多,实现方式也是花样百出:
文章链接:
有了结果我们就应该追溯下源头,分布式锁的概念最早应该起源于synchronized与Lock的应用。只是后来这两种都无法满足分布式应用的时候,人们才逐渐引入了后来的分布式锁。
本文我们着重剖析下synchronized与Lock。
区别:
1.首先synchronized是java内置关键字,在jvm层面,Lock是个java接口,是基于JDK层面实现的,通过这个接口可以实现同步访问;
2.synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁 c 调用wait()方法释放锁,Lock必须要在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;
3.用synchronized的两个线程,如果线程a拿到了锁执行代码块,b只有等待a代码块执行完毕或则a主动释放锁。此时,如果线程a阻塞的话,b会一直等待下去。
但是如果使用Lock锁,线程b就不一定会一直等待下去,如果尝试获取不到锁,线程b可以在指定时间内结束或则同步结束返回false未拿到锁。
4.synchronized和Lock特性比较
5.Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。
6.synchronized无法判断线程获取到锁,而Lock则可以通过(ReentrantLock)得知线程有没有成功获取到锁。
使用场景:
synchronized
占有锁的线程执行完了该代码块,然后释放对锁的占有;
占有锁线程执行发生异常,此时JVM会让线程自动释放锁;
占有锁线程进入 WAITING 状态从而释放锁,例如在该线程中调用wait()方法等。
Lock
在使用synchronized关键字的情形下,假如占有锁的线程由于要等待IO或者其他原因(比如调用sleep方法)被阻塞了,但是又没有释放锁,那么其他线程就只能一直等待。这会极大影响程序执行效率。
因此,就需要有一种机制可以不让等待的线程一直无期限地等待下去(比如只等待一定的时间 (解决方案:tryLock(long time, TimeUnit unit)) 或者 能够响应中断 (解决方案:lockInterruptibly())),这种情况可以通过 Lock 解决。
Lock 继承关系
锁应用实操
1:两个线程获取锁,a先拿到锁,b再去拿锁:
运行结果如下:
2:两个线程尝试获取锁,a先尝试拿到锁,b在尝试去获取锁:
运行结果如下
3:两个线程尝试制定时间内去获取锁,a尝试2秒,拿到锁之后睡眠3秒,b在去尝试获取锁:
可见b无法拿到锁:
4:两个线程尝试制定时间内去获取锁,a尝试4秒,拿到锁之后睡眠3秒,b在去尝试获取锁:
尝试时间改为4秒后,睡眠3秒,对线程b就可以拿到了锁:
同学们可以实际运行下,"纸上得来终觉浅,绝知此事要躬行"。只有实际跑一下,才会有更深的理解,可能还会有意想不到的 收获~
java 分布式同步锁_java编程进阶之路:回归锁的本质,探索分布式锁之源头相关推荐
- 自旋锁 轻量锁_Java知识进阶-程序员升往架构师必经之路-自旋锁-知识铺
知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累.不占太多时间,不停的来唤醒你记忆深处的知识点. 一. 锁类型 1.1 乐观锁 Java中CAS操作,就是一种乐观锁,前文也讲过了详细的 ...
- java 并发 同步信号_Java并发教程–信号量
java 并发 同步信号 这是我们将要进行的Java并发系列的第一部分. 具体来说,我们将深入研究Java 1.5及更高版本中内置的并发工具. 我们假设您对同步和易失性关键字有基本的了解. 第一篇文章 ...
- java 多线程同步问题_Java多线程同步问题:一个小Demo完全搞懂
版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.一个简单的Demo引发的血案 关于线程同步问题我们从一个 ...
- java中同步组件_Java并发编程(自定义同步组件)
并发包结构图: 编写一个自定义同步组件来加深对同步器的理解 业务要求: * 编写一个自定义同步组件来加深对同步器的理解. * 设计一个同步工具:该工具在同一时刻,只允许至多两个线程同时访问,超过两个线 ...
- java的同步块_Java 同步块
Java同步块用来标记一个方法或一个代码块为同步的.Java同步块可以用来避免竞态. Java同步关键字 在 Java 中使用 synchronized 来标记同步块.一个同步块是同步在某些对象上.同 ...
- java数据同步解决方案_Java实现多线程数据同步的几种方法
1. 应用背景 程序在设计当中如果采取多线程操作的时候,如果操作的对象是一个的话,由于多个线程共享同一块内存空间,因此经常会遇到数据安全访问的问题,下面看一个经典的问题,银行取钱的问题:1).你有一张 ...
- java程序输出矩阵_java编程题之顺时针打印矩阵
本文实例为大家分享了java顺时针打印矩阵的具体代码,供大家参考,具体内容如下 import java.util.ArrayList; /** * * 剑指offer编程题(JAVA实现)--第19题 ...
- java数据同步处理_Java如何处理多线程的数据同步问题
在这里写这种文章好奇怪,先用作笔记吧 Java中有如下的方法来处理代码块的并发访问问题: 一是关键字synchronized 二是加锁(锁对象,条件对象) Java给每一个对象都提供了一个内部锁,在方 ...
- java卡片布局例子_Java编程使用卡片布局管理器示例【基于swing组件】
本文实例讲述了java编程使用卡片布局管理器.分享给大家供大家参考,具体如下: 运行效果: 完整示例代码: package com.han; import java.awt.borderlayout; ...
- java程序算法实例_java编程算法经典案例
编程经典案例(持续更新中,敬请期待): 一.购物问题 小明的女朋友最喜欢在网上买买买了,可是钱包里钞票有限,不能想买啥就买啥.面对琳琅满目的物品,她想买尽可能多的种类,每种只买一件,同时总价格还不能超 ...
最新文章
- [WinAPI] API 4 [注册][创建][消息][第一个框架类窗口]
- 【Java多线程】生产者消费者问题
- 女人 这20种男人你永远不必等
- 用最科学的方法展示最形象的图表——前段数据可视化选型实践
- 基于DPDK+VPP实现高性能防火墙
- 【CMAKE系列】cmake中CMakeLists.txt脚本的常用语法
- 少量数据通过Excel表格数据导入server SqlServer查询
- 计算机毕业设计Java物料生产管理系统(源码+系统+mysql数据库+Lw文档)
- 清明上河图对计算机技术的启发,《清明上河图》鉴定故事的启示
- 映美精LoadDeviceStateFromFile问题
- Python自动化办公:xlwt万字教程
- Cloudflare找不到服务器 IP 地址
- 楼氏电子推出具有高级功能的人工智能型TWS开发套件
- 电脑上打印准考证照片不清楚咋办
- Springboot + Shiro——MD5 盐值加密(配置)
- 在机器人面前,人类怎样做才能不悲观
- 巴别塔合约作战终端开发日记4——后端效率优化
- 判断是否是对象本身的属性(hasOwnProperty)
- 关于Windows10服务中没有SNMP Service问题以及SNMP没有安全选项的问题
- 在 Kubernetes 实施混沌工程—— Chaos Mesh® 原理分析与控制面开发