JAVA有哪些类型的锁?大爷点醒了我!

最近在公司干活有点压力大了,老项目加功能加了两个月都没写完,面对老项目某些屎一样的业务代码…

刚开始接到任务是这样的
在这里插入图片描述
后来看到代码后,就变成这样了
在这里插入图片描述
没办法,上级安排了任务就要去执行,而且还要执行得漂漂亮亮才行,要不然怎么升职加薪…这里不多说了,有空再专门写一篇分享码农日常上班。

Java语言在处理多线程并发问题时,相比于其他同为服务端的语言来说,有一定的优势!

虽然性能上比不上C++,但是在业务实现方面比C++容易。而一直号称编程语言第一的PHP,在中小型后台业务开发方面速度的确一流,但在遇到并发量高的业务场景,却有些力不从心了(PHP是世界上最好的语言!所以我选择JAVA)
在这里插入图片描述
java处理多线程同步问题,最典型的方案是加锁。为什么加锁就能解决同步问题?

举个栗子,100个人想上厕所,但是厕所只有一个坑位,这个时候坑位该分配给谁?

为了大家都能正常上完厕所,这个时候管理厕所的大爷就出来做了约束,他说:谁先第一个进门谁就先上,其他的依照进门的顺序排队,直到前面的上完出来后面的再上。这个就是java中的公平锁,依照队列的顺序执行
在这里插入图片描述
过了一会,突然有个人跟大爷说:大爷,我是你小姨的二姑的大舅哥姥姥家的的儿子,能不能给我个VIP优先,大爷觉得也是那么一回事,既然你跟我有关系,那你还是有点实力的,就让你先上吧,然后剩下的没有关系的就排队吧。这就是JAVA中的非公平锁,各凭本事抢先,抢到你就先执行;

第二天,大爷被投诉举报了,说利用厕所管理职权为亲戚谋取上厕所的VIP,大爷被领导批评了一顿,心理那个气啊,既然说我徇私枉法,那我之后无论是谁,只允许一个人进门,等那个人出门才能进下一个。这就是JAVA中的悲观锁,在一个时间点只能有一条线程能进入执行。

第三天,领导来巡查突然想上厕所了,来到厕所旁边发现连门都进不去,吐槽这厕所的吞吐量也太差了。于是找到了大爷,说最后虽然能解决大家上厕所问题,但是让人憋得太久了。
在这里插入图片描述
然后说,要不这样吧,每个进去的人,你隔个时间去敲门问他是否还在拉,如果不拉了叫他赶紧出来,让下一个进去,不要占着坑位不拉*。不得不说领导的方法还是很有效的,把一些想在厕所摸鱼的人都通通赶了出来,厕所的吞吐量一下子就上来了。
在这里插入图片描述
可大爷就累惨了,要一直不停去问人,就算没人上厕所也要隔段时间去问。这个就是JAVA中的乐观锁/自旋锁,先进行比较,符合条件就执行,但是如果一直拿不到锁,就会一直自旋,消耗系统资源。

过了一段时间后,大爷终于受不住,天天这样跑,黄牛都累坏。于是找到领导说,虽然领导的这个方法不错,但是这样子我太累了。虽然你是领导,但是哪天把我累挂了,你也有责任。
在这里插入图片描述

这样吧,我有一个法子,咱们现在这个厕所不是只有一个坑位么,而且是大小便都用这个坑位,我们申请一笔资金再另外建立一个小便池,小便池允许同一时间多人共用,而大便的依然是用坑位,但是小便池仅仅是上小的,不需要占用坑位,这样也能解决吞吐量。领导一听这注意不错,遂批!从此大爷又能与厕所过上没羞没臊的小日子了。只能有一个人用坑位上大号,这就是JAVA中的排它锁/写锁,而可以容纳多人同时使用的小便池就是JAVA中的共享锁/读锁。

在这里插入图片描述

总结

JAVA将锁类型可以简单划分为:

公平锁/非公平锁

公平锁:多个线程相互竞争时要排队,多个线程按照申请锁的顺序来获取锁。

非公平锁:多个线程相互竞争时,先尝试插队,插队失败再排队,比如:synchronized、ReentrantLock

乐观锁和悲观锁

乐观锁:乐观锁认为一个线程去拿数据的时候不会有其他线程对数据进行更改,所以不会上锁。

实现方式:CAS机制、版本号机制

悲观锁:悲观锁认为一个线程去拿数据时一定会有其他线程对数据进行更改。所以一个线程在拿数据的时候都会顺便加锁,这样别的线程此时想拿这个数据就会阻塞。比如Java里面的synchronized关键字的实现就是悲观锁。实现方式:就是加锁。

排它锁(互斥锁)和共享锁(实现一般为写锁和读锁)

独享锁:该锁一次只能被一个线程所持有

共享锁:该锁可以被多个线程所持有

具体实现就是synchronized、ReentrantLock。ReentrantLock是JDK1.5的新特性,采用ReentrantLock可以完全替代替换synchronized传统的锁机制,更加灵活。

读写锁的具体实现就是读写锁ReadWriteLock。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值