浅谈java中的锁

JAVA中的锁

  • 自旋锁:当一个线程要获取锁的时候,该锁被其他线程获取,那么该线程将循环等待,不判断该锁是否能够被成功获取,直到获取到该锁才会退出循环。

自旋锁实现例子:通过CAS操作实现加锁与解锁逻辑,循环等待占用锁的线程解锁。

自旋锁代码实现例子

  • 乐观锁:假定没有冲突,获取数据当修改时发现其与最新数据不一致,则重新获取最新数据再次进行修改。

乐观锁实现例子:通过版本号+递归实现乐观锁

    表设计时,需要往表里加一个version字段。每次查询时,查出带有version的数据记录,更新数据时,判断数据库里对应id的记录的version是否和查出的version相同。若相同,则更新数据并把版本号+1;若不同,则说明,该数据发送并发,被别的线程使用了,进行递归操作,再次执行递归方法,知道成功更新数据为止。

    上述automaticAssign方法即实现了一个乐观锁,作用是冲数据库里更新一条数据病返回前端。如果并发率大,一次请求可能则会重复执行很多次automaticAssign,则性能低。如果并发很乐观,用户请求少,则不需要用synchronized,多线程时性能高。
乐观锁实现例子

  • 悲观锁:假定数据一定会冲突,同步数据的所有操作,从读数据就开始加锁。

    Java中悲观锁的实现:synchronized mysql关闭事务自动提交后,则可通过类似 select * from X where id=1 for update在当前事务中对id=1的数据加锁,如果在此事务中修改id=1的数据则会阻塞等待锁释放。

悲观锁实现例子详解

  • 独享锁(写):给资源加上写锁,拥有该资源的线程可以进行修改,其他线程不能够再加锁(单写)。
  • 共享锁(读):给资源加上读锁,该资源只能读不能修改,其他线程也可以给这个资源加读锁(多读)。

参考资料:深入理解Java中的锁(一)深入理解Java中的锁(二)深入理解Java中的锁(三)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值