网站首页 > java教程 正文
开篇引论
众所周知,现在分布式应用越来越广泛,尤其是现在随着"中台"的搭建,分布式显得尤为重要,小到关乎应用的性能,大到影响一个企业的未来。在现在这个互联网飞速发展的时代,如果你所在的企业还未能引入"中台"的概念,那么你可以考虑一下今后的打算了。就算你用不着为企业着想,也要为自己的职业生涯负责。
都知道现在分布式锁应用越来越多,实现方式也是花样百出:
文章链接:
Redis分布式锁的实现方式之一(基于springboot项目搭建)
有了结果我们就应该追溯下源头,分布式锁的概念最早应该起源于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就可以拿到了锁:
同学们可以实际运行下,"纸上得来终觉浅,绝知此事要躬行"。只有实际跑一下,才会有更深的理解,可能还会有意想不到的 收获~
猜你喜欢
- 2024-11-22 redis分布式锁
- 2024-11-22 4K字深度剖析redisson分布式锁原理
- 2024-11-22 java都为我们提供了各种锁,为什么还需要分布式锁?
- 2024-11-22 一文带你了解Java手写分布式锁的实现
- 2024-11-22 如何用Redisson框架实现分布式锁?
- 2024-11-22 基于 Redis 实现的分布式锁
- 2024-11-22 京东秒杀系统模块的Redis分布式锁深度剖析,没给你讲明白你打我
- 2024-11-22 面试官:Redis分布式锁超时了,任务还没执行完怎么办?
- 2024-11-22 聊聊Redis分布式锁
- 2024-11-22 浅谈分布式锁
你 发表评论:
欢迎- 最近发表
-
- 五,网络安全IDA Pro反汇编工具初识及逆向工程解密实战
- 「JAVA8」- Lambda 表达式(java lambda表达式原理)
- 深入探讨Java代码保护:虚拟机保护技术的新时代
- Nginx反向代理原理详解(图文全面总结)
- 逆向拆解日本IT,哪些Java技术栈薪资溢价高
- mybatis 逆向工程使用姿势不对,把表清空了,心里慌的一比
- Spring Boot集成ProGuard轻松实现Java 代码混淆, Java 应用固若金汤
- 从 Java 代码逆向工程生成 UML 类图和序列图
- 人与人相处:尊重是标配,靠谱是高配,厚道是顶配
- Windows系统安装日期如何修改(windows10怎么修改安装日期)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)