在开发中有些业务我们可能会使用到乐观锁或者悲观锁,但是具体使用场景需要结合具体业务需求和并发情况进行选择。下面用代码来简单实现两种锁

一、乐观锁

概念: 乐观锁从字面上来看就知道它是比较乐观的,它认为数据一般不会产生冲突,因此开始执行方法的时候一般不加锁,只有当数据进行提交更新时,才会真正对数据是否产生冲突进行监测,再加锁更新数据。如果监测时发生冲突,就返回给用户错误信息,由用户来决定如何去做。

代码示例:

public class OptimisticLockExample {private int version;public void optimisticLockTest() {int v = version;// 假设一些其他操作可能会改变version值// 执行一些其他操作...version++;// 更新数据前监测version是否因为其他操作修改了if (v == version - 1) {// 版本号未被其他线程改变,操作成功// 更新业务逻辑代码...} else {// 被改动了,抛出异常throw new OptimisticLockException("版本号已被其他线程改变,操作失败");}}
}

乐观锁通常是基于版本号的,需要对数据库表进行设计,增加版本号字段,一般都会使用CAS(compare-and-swap)算法实现。但不一定使用CAS算法,这里是一个简单的Java乐观锁示例,optimisticLockTest()方法先保存当前版本号为 v ,然后执行一些其他操作,假设这些操作可能会改变version值。然后比较 v 和当前版本号-1的值,如果相等则说明版本号未被其他线程改变,操作成功;否则抛出OptimisticLockException异常,表示版本号已被其他线程改变,操作失败。

适用场景: 乐观锁适用于读多写少的场景,如缓存更新、统计分析等。因为乐观锁不需要加锁,可以提高并发性能。

二、悲观锁

概念: 悲观锁它总是会假设当前情况是最坏的情况,在每次去拿数据的时候,都会认为数据会被别人改变,所以在拿数据的时候一开始就加锁,确保同一时刻只有一个线程能够访问和修改数据,其他线程需要等待当前线程释放锁之后才能进行访问和修改。

代码示例:

public class PessimisticLockExample {private Lock lock = new ReentrantLock();public void pessimisticLockTest() {// 获取锁lock.lock();try {// 执行共享资源操作..} finally {lock.unlock();}}
}

Java里面synchronized(同步锁)ReentrantLock(重入锁)独占锁就是悲观锁思想的实现,上述代码使用的是ReentrantLock(重入锁),在对共享资源进行操作时,先通过lock()方法获取锁,操作完成后再通过unlock()方法释放锁。这种方式能够保证同一时刻只有一个线程能够对资源进行操作。

适用场景: 悲观锁适用于写多读少的场景,如银行转账、库存更新等。因为悲观锁需要加锁,可以保证数据的一致性和完整性,但是也会降低并发性能。


三、总结

乐观锁通常是通过CAS算法来实现,也可以使用版本号或时间戳等方式。而悲观锁通常是通过synchronized关键字或者ReentrantLock来实现的。当多个线程同时更新同一条数据时,如果使用乐观锁,可能会发生更新冲突,需要进行重试或者回滚操作;而如果使用悲观锁,则可以保证同一时刻只有一个线程能够更新数据,不会出现更新冲突。总之,乐观锁和悲观锁各有优缺点,具体使用场景需要结合具体业务需求和并发情况进行选择。

Java实现乐观锁和悲观锁相关推荐

  1. **Java有哪些悲观锁的实现_面试4连问:乐观锁与悲观锁的概念、实现方式、场景、优缺点?...

    推荐阅读: 数据库面试4连问:分库分表,中间件,优缺点,如何拆分? 终极手撕之架构大全:分布式+框架+微服务+性能优化,够不够? 消息队列面试,你能顶得住面试官这波10大连环炮的攻势吗? 01 乐观锁 ...

  2. 详解各种锁:CAS、共享锁、排它锁、互斥锁、悲观锁、乐观锁、行级锁、表级锁、页级锁、死锁、JAVA对CAS的支持、ABA问题、AQS原理

    共享锁(S锁) 又称为读锁,可以查看但无法修改和删除的一种数据锁.如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排它锁.获准共享锁的事务只能读数据,不能修改数据. 共享锁下其它用 ...

  3. Java死锁、活锁,悲观锁、乐观锁

    1.死锁与活锁的区别,死锁与饥饿的区别? 死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去. 产生死锁的必要条件: 互斥条 ...

  4. 乐观锁和悲观锁的使用场景及应用——Java高并发系列学习笔记

    一. 定义 1.乐观锁:顾名思义,对每次的数据操作都保持乐观的态度,不担心数据会被修改,所以不会对数据进行上锁.由于数据没有上锁,这就存在数据会被多人读写的情况.所以每次修改数据的时候需要对数据进行判 ...

  5. **Java有哪些悲观锁的实现_「Java并发编程」何谓悲观锁与乐观锁,Java编程你会吗...

    何谓悲观锁与乐观锁 悲观锁 乐观锁 两种锁的使用场景 乐观锁常见的两种实现方式 1. 版本号机制 2. CAS算法 乐观锁的缺点 1 ABA 问题 2 循环时间长开销大 3 只能保证一个共享变量的原子 ...

  6. Java并发篇_乐观锁与悲观锁

    乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展. 一.引入概念 1.悲观锁 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次 ...

  7. Java并发编程(05):悲观锁和乐观锁机制

    本文源码:GitHub·点这里 || GitEE·点这里 一.资源和加锁 1.场景描述 多线程并发访问同一个资源问题,假如线程A获取变量之后修改变量值,线程C在此时也获取变量值并且修改,两个线程同时并 ...

  8. Java多线程学习总结(5)——乐观锁和悲观锁的基本概念、实现方式(含实例)、适用场景及常见面试题

     分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!点击浏览教程 一.基本概念 乐观锁和悲观锁是两种思想,用于解决并发场景下的数据竞争问题. 乐观锁 ...

  9. Java并发 乐观锁和悲观锁 乐观锁的一种实现方式CAS

    为什么80%的码农都做不了架构师?>>>    首先介绍一些乐观锁与悲观锁: 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人 ...

  10. Java之乐观锁和悲观锁

    Java之乐观锁和悲观锁 乐观锁 用到的机制是CAS(Compare and Swap),每个线程都可以访问,只有在提交数据的时候,检查是否违反了数据的完整性.如果发生冲突失败重试,直到成功为止.乐观 ...

最新文章

  1. php display_errors
  2. 什么是离散的Hopfield网络?
  3. 零基础学习python爬虫_教你零基础如何入门Python爬虫!
  4. PostgreSQL示例demo
  5. docker 添加端口映射_Docker三大核心概念之容器
  6. 第三次学JAVA再学不好就吃翔(part46)--Scanner类
  7. spring缓存_有关Spring缓存性能的更多信息
  8. Python3——简单的TCP实例
  9. 未能初始化appscan应用程序现在将关闭_企业区块链应用程序的两个关键问题
  10. pca百分比取多少比较好_母亲节给妈妈发多少红包比较好合适 母亲节红包吉利数字含义...
  11. 【专栏精选】实战:动态配置图片
  12. android 友盟推送获取不到devicetoken,使用友盟消息推送中遇到的哪些问题--索引(开发者必读)...
  13. java加按钮_用java写一个简单的学生信息管理系统
  14. [hiho 10]由前序中序遍历求后序遍历
  15. 学用ASP.NET2.0
  16. 提高excel生产力_1.提高员工生产力和工作满意度
  17. Windows开启网络对时方法
  18. 看看故障诊断文献中的故障设置方法-中文论文篇
  19. 舱机器人尾巴毛茸茸_并无卵用的毛茸茸机器人 如此呆萌 设计是为了爱
  20. 离散数学——coq学习笔记(二)

热门文章

  1. 音乐视频互动直播,这事儿为什么是陌陌在做?
  2. 机器人抓取实验演示视频
  3. Python-pythonic
  4. 全卷积网络FCN的缺陷
  5. dodon ***X-NG-R8
  6. 深入分析微信小程序带来的机遇
  7. Android实现跑马灯效果及问题解决
  8. 微信小程序实例 - 手机号归属地查询
  9. win10ad域 用户和计算机,Windows AD域通过GPO设置客户端电脑本地管理员账号密
  10. 如何通过ildasm/ilasm修改assem“.NET研究”bly的IL代码