您现在的位置:首页 >> 基础 >> Java编程 >> 内容

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

时间:2020-11-26 10:21:09

  核心提示:1、sql锁:悲观锁:就是考虑问题很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁;实现:sql语句后边加上for update例子:Select id,nam from b...

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接口的类)是个不错的方案。

Java免费学习   Java自学网 http://www.javalearns.com

关注微信号:javalearns   随时随地学Java

或扫一扫

随时随地学Java

作者:不详 来源:网络
    你是从哪里知道本网站的?
  • 网友介绍的
  • 百度搜索的
  • Google搜索的
  • 其它搜索过来的
  • 网址输错了进来的
  • 太忙了不记得了
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • java学习网(www.javalearns.com) © 2014 版权所有 All Rights Reserved.
  • Email:javalearns@163.com 站长QQ:1356121699 晋ICP备14003680号-3
  • java学习网部分内容来自网络或网友发布,如侵犯了您利益,请发邮件至:javalearns@126.com,我们尽快处理!
  • Java学习网
  • 网站统计
  • 晋公网安备 14042902000001号