首页 > 其他分享 >乐观锁和悲观锁

乐观锁和悲观锁

时间:2023-12-07 22:55:07浏览次数:26  
标签:加锁 lock 乐观 线程 悲观 操作 数据

悲观锁

认为⾃⼰在使⽤数据的时候⼀定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。

synchronized关键字和Lock的实现类都是悲观锁

适合写操作多的场景,先加锁可以保证写操作时数据正确。

调用方式

//=============悲观锁的调⽤⽅式

public synchronized void m1()

{

//加锁后的业务逻辑......

}

// 保证多个线程使⽤的是同⼀个lock对象的前提下

ReentrantLock lock = new ReentrantLock();

public void m2() {

lock.lock();

try {

// 操作同步资源

}finally {

lock.unlock();

}

}

乐观锁

乐观锁认为⾃⼰在使⽤数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。

如果这个数据没有被更新,当前线程将⾃⼰修改的数据成功写⼊。如果数据已经被其他线程更新,则根据不同的实现⽅式执⾏不同的操作

乐观锁在Java中是通过使⽤⽆锁编程来实现,最常采⽤的是CAS算法,Java原⼦类中的递增操作就通过CAS⾃旋实现的。

适合读操作多的场景,不加锁的特点能够使其读操作的性能⼤幅提升。

乐观锁则直接去操作同步资源,是⼀种⽆锁算法,得之我幸不得我命,再抢

乐观锁⼀般有两种实现⽅式:

  1. 采⽤版本号机制
  2. CAS(Compare-and-Swap,即⽐较并替换)算法实现

调用方式

//=============乐观锁的调⽤⽅式

// 保证多个线程使⽤的是同⼀个AtomicInteger

private AtomicInteger atomicInteger = new AtomicInteger();

atomicInteger.incrementAndGet();

标签:加锁,lock,乐观,线程,悲观,操作,数据
From: https://www.cnblogs.com/lin513/p/17884193.html

相关文章

  • 悲观锁、乐观锁、mybatis-plus实现乐观锁
    转载自:www.javaman.cn1、悲观锁、乐观锁乐观锁和悲观锁是两种用于处理并发操作的数据锁定策略。它们在处理多个事务尝试同时访问和修改同一数据时的方法有所不同。悲观锁(PessimisticLocking):概念:悲观锁是一种基于悲观态度的数据并发控制机制。它总是假设最坏的情况,即认为其他......
  • 悲观锁、乐观锁、mybatis-plus实现乐观锁
    悲观锁、乐观锁、mybatis-plus实现乐观锁转载自:www.javaman.cn1、悲观锁、乐观锁乐观锁和悲观锁是两种用于处理并发操作的数据锁定策略。它们在处理多个事务尝试同时访问和修改同一数据时的方法有所不同。悲观锁(PessimisticLocking):概念:悲观锁是一种基于悲观态度的数......
  • Django中实现事务的几种方式、事物的回滚和保存点、事务提交后,执行某个回调函数、Djan
    Django中实现事务的几种方式#https://zhuanlan.zhihu.com/p/622987268Django是支持事务操作的,它的默认事务行为是自动提交,具体表现形式为:每次数据库操作(比如调用save()方法)会立即被提交到数据库中。但是如果你希望把连续的SQL操作包裹在一个事务里,就需要手动开启事务#......
  • 悲观剪枝
    https://www.bilibili.com/video/BV175411g7T7/?spm_id_from=333.337.search-card.all.click&vd_source=5a8099d424866bf1cdbfa5a7afadeca6个人理解,一个人腿被压了去医院,医生说在不做任何干预的情况下,有乐观(期望-1倍标准差),中性(期望),悲观(期望+1倍标准差)3种情况,乐观(休息2天就出院了......
  • 如何实现乐观锁
    乐观锁一般会使用版本号机制或CAS算法实现,CAS算法相对来说更多一些,这里需要格外注意。#版本号机制一般是在数据表中加上一个数据版本号 version 字段,表示数据被修改的次数。当数据被修改时,version 值会加一。当线程A要更新数据值时,在读取数据的同时也会读取 version 值,在......
  • 鼻咽癌的一些感悟!(乐观坚韧是最难得)
    1.记得之前的自己从小就害怕进医院,怕手术,更怕癌症!所以努力健康作息,不抽烟,少酒(因为聚餐职场避免不了),不吃外卖,不吃奶茶冰淇淋等,晚上空余下班时间散散步,跳绳,在这之前总觉得自己是天选之子,没生过什么病,感冒,新冠抗几天就康复了,感觉这辈子都会顺顺利利的,不会和大......
  • 乐观锁
    在最近的springboot的学习中,了解到了一种java用于处理并发问题的一种机制——乐观锁。接下来我会简单的介绍一下它的原理。首先我们为什么需要乐观锁,举一个简单的例子,在国庆节的时候,我们打算出门旅行,这时候我想去北京的故宫博物院,恰逢放假,买票的人也不少,我们选择线上购票,由于供不......
  • 悲观锁与乐观锁
    悲观锁悲观锁就是某个事务在更新数据过程中将数据锁定,其他任何事务都不能读取或修改,必须修改完成后才能访问数据(类似于Java的线程同步锁机制) 乐观锁乐观锁并不是一种数据库锁机制,而是一种冲突检测机制(版本冲突检测机制和时间戳冲突检测机制),它的特点就是并发性较好,事务修改数......
  • 悲观锁与乐观锁
    乐观锁:顾名思义,乐观锁就是持比较乐观态度的锁。就是在操作数据时非常乐观,认为别的线程不会同时修改数据,所以不会上锁,但是在更新的时候会判断在此期间别的线程有没有更新过这个数据。悲观锁:就是持悲观态度的锁。就在操作数据时比较悲观,每次去拿数据的时候认为别的线程也会同时修......
  • 乐观锁的原理解析
    CAS(比较与交换,Compareandswap)是一种有名的无锁算法,它是乐观锁的一种实现方式。所以在进行CAS原理分析的时候,我们先来了解什么是乐观锁,什么是悲观锁~乐观锁与悲观锁乐观锁和悲观锁是在数据库中引入的名词,但是在我们Java的JUC里面的锁也引入类似的思想!我们来看看两种锁的概念......