开篇引论

众所周知,现在分布式应用越来越广泛,尤其是现在随着"中台"的搭建,分布式显得尤为重要,小到关乎应用的性能,大到影响一个企业的未来。在现在这个互联网飞速发展的时代,如果你所在的企业还未能引入"中台"的概念,那么你可以考虑一下今后的打算了。就算你用不着为企业着想,也要为自己的职业生涯负责。

都知道现在分布式锁应用越来越多,实现方式也是花样百出:

文章链接:

有了结果我们就应该追溯下源头,分布式锁的概念最早应该起源于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编程进阶之路:回归锁的本质,探索分布式锁之源头相关推荐

  1. 自旋锁 轻量锁_Java知识进阶-程序员升往架构师必经之路-自旋锁-知识铺

    知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累.不占太多时间,不停的来唤醒你记忆深处的知识点. 一. 锁类型 1.1 乐观锁 Java中CAS操作,就是一种乐观锁,前文也讲过了详细的 ...

  2. java 并发 同步信号_Java并发教程–信号量

    java 并发 同步信号 这是我们将要进行的Java并发系列的第一部分. 具体来说,我们将深入研究Java 1.5及更高版本中内置的并发工具. 我们假设您对同步和易失性关键字有基本的了解. 第一篇文章 ...

  3. java 多线程同步问题_Java多线程同步问题:一个小Demo完全搞懂

    版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.一个简单的Demo引发的血案 关于线程同步问题我们从一个 ...

  4. java中同步组件_Java并发编程(自定义同步组件)

    并发包结构图: 编写一个自定义同步组件来加深对同步器的理解 业务要求: * 编写一个自定义同步组件来加深对同步器的理解. * 设计一个同步工具:该工具在同一时刻,只允许至多两个线程同时访问,超过两个线 ...

  5. java的同步块_Java 同步块

    Java同步块用来标记一个方法或一个代码块为同步的.Java同步块可以用来避免竞态. Java同步关键字 在 Java 中使用 synchronized 来标记同步块.一个同步块是同步在某些对象上.同 ...

  6. java数据同步解决方案_Java实现多线程数据同步的几种方法

    1. 应用背景 程序在设计当中如果采取多线程操作的时候,如果操作的对象是一个的话,由于多个线程共享同一块内存空间,因此经常会遇到数据安全访问的问题,下面看一个经典的问题,银行取钱的问题:1).你有一张 ...

  7. java程序输出矩阵_java编程题之顺时针打印矩阵

    本文实例为大家分享了java顺时针打印矩阵的具体代码,供大家参考,具体内容如下 import java.util.ArrayList; /** * * 剑指offer编程题(JAVA实现)--第19题 ...

  8. java数据同步处理_Java如何处理多线程的数据同步问题

    在这里写这种文章好奇怪,先用作笔记吧 Java中有如下的方法来处理代码块的并发访问问题: 一是关键字synchronized 二是加锁(锁对象,条件对象) Java给每一个对象都提供了一个内部锁,在方 ...

  9. java卡片布局例子_Java编程使用卡片布局管理器示例【基于swing组件】

    本文实例讲述了java编程使用卡片布局管理器.分享给大家供大家参考,具体如下: 运行效果: 完整示例代码: package com.han; import java.awt.borderlayout; ...

  10. java程序算法实例_java编程算法经典案例

    编程经典案例(持续更新中,敬请期待): 一.购物问题 小明的女朋友最喜欢在网上买买买了,可是钱包里钞票有限,不能想买啥就买啥.面对琳琅满目的物品,她想买尽可能多的种类,每种只买一件,同时总价格还不能超 ...

最新文章

  1. [WinAPI] API 4 [注册][创建][消息][第一个框架类窗口]
  2. 【Java多线程】生产者消费者问题
  3. 女人 这20种男人你永远不必等
  4. 用最科学的方法展示最形象的图表——前段数据可视化选型实践
  5. 基于DPDK+VPP实现高性能防火墙
  6. 【CMAKE系列】cmake中CMakeLists.txt脚本的常用语法
  7. 少量数据通过Excel表格数据导入server SqlServer查询
  8. 计算机毕业设计Java物料生产管理系统(源码+系统+mysql数据库+Lw文档)
  9. 清明上河图对计算机技术的启发,《清明上河图》鉴定故事的启示
  10. 映美精LoadDeviceStateFromFile问题
  11. Python自动化办公:xlwt万字教程
  12. Cloudflare找不到服务器 IP 地址
  13. 楼氏电子推出具有高级功能的人工智能型TWS开发套件
  14. 电脑上打印准考证照片不清楚咋办
  15. Springboot + Shiro——MD5 盐值加密(配置)
  16. 在机器人面前,人类怎样做才能不悲观
  17. 巴别塔合约作战终端开发日记4——后端效率优化
  18. 判断是否是对象本身的属性(hasOwnProperty)
  19. 关于Windows10服务中没有SNMP Service问题以及SNMP没有安全选项的问题
  20. 在 Kubernetes 实施混沌工程—— Chaos Mesh® 原理分析与控制面开发

热门文章

  1. 零基础学习嵌入式给出的10条中肯的建议
  2. 20个Flutter实例视频教程-01节底部导航栏和切换效果的制作-1
  3. 内置函数、匿名函数、递归、二分法
  4. RedHat 6.4源码方式安装mysql5.5
  5. OC字符串相加,结果按照字符串形式输出
  6. MediaChooser图库浏览器
  7. Git 常用命令(转)
  8. MFC 中获取各种类指针的方法
  9. oracle实施过程中误区,oracle 开发误区探索《二》
  10. oracle手动锁表和解锁_Oracle锁表查询和解锁方法