首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java项目实践,锁机制学习,sql锁与方法锁

Java项目实践,锁机制学习,sql锁与方法锁

作者头像
用户1289394
发布2020-12-08 15:02:39
发布2020-12-08 15:02:39
6170
举报
文章被收录于专栏:Java学习网Java学习网

1、sql锁:

悲观锁:就是考虑问题很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁;

实现:sql语句后边加上for update

例子:Select id,nam from biao for update

乐观锁:就是考虑问题很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁

实现:在表里边加一个vesion

例子:

Select max(nub) ,version from biao

Update biao set nub=nub+1,version=vsersion+1 where id=id and version =version

2、方法锁:

方法锁主要包括:synchronized锁和lock锁

区别:

1)Lock是一个接口,而synchronized是Java中的关键字;

2)synchronized当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁,不能够响应中断,(释放:1执行完线程自动释放2发生异常jvm让线程释放)((比如调用sleep方法)),这样的好处是不会导致死锁现象发生。

Lock锁,可以不让等待的线程一直无期限地等待下去,比如只等待一定的时间或者响应中断。

但Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时必须在try{}catch{}块中进行,需要在finally块中释放锁;

3)通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。

在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。所以说,在具体使用时要根据适当情况选择。

在并发量比较小的情况下,使用synchronized是个不错的选择,但是在并发量比较高的情况下,其性能下降很严重,此时ReentrantLock(可重入锁,唯一实现了Lock接口的类)是个不错的方案。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java学习网 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档