java提供了很多种类的,每种都有其特性,根据特性在适当的场景下能够展现出非常高的效率。下图来源于https://zhuanlan.zhihu.com/p/50098743 在一个高并发秒杀的场景下中,很有可能会出现超卖的情况,要解决超卖的问题,可以对数据库中的表或记录加锁。我刚开始在秒杀项目中是用悲观来解决超卖的问题,但是在并发量很高的情况,悲观的效率可能不是很好,因此,我改用乐观来代
转载 2024-04-19 17:33:12
52阅读
一、(Lock)的概念,在我们生活中随处可见,我们的门上有,我们存钱的保险柜上有,是用来保护我们财产安全的。程序中也有,当多个线程修改共享变量时,我们可以给修改操作上锁(syncronized)。当多个用户修改表中同一数据时,我们可以给该行数据上锁(行)。因此,其实是在并发下控制多个操作的顺序执行,以此来保证数据安全的变动。并且,是一种保证数据安全的机制和手段,而并不是特定于某项技
的分类从宏观上分类,分为悲观乐观乐观   乐观是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。   java中的乐观基本都是通过CAS操作实现的,C
前段时间有人问我java中的乐观和悲观的问题,我被问愣神了,乐观和悲观我到是听说过,在数据库里面应用极广,但是java里面就好像没有听说过,后来我详细去看了下《java编程思想》,的确在java里面有乐观的描述。1.什么是java中的乐观和悲观悲观:悲观是认为肯定有其他线程来争夺资源,因此不管到底会不会发生争夺,悲观总是会先去锁住资源。乐观:所谓的乐观就是当去做某个修改或其
java的各种详细介绍1. 乐观和悲观乐观与悲观是一种广义上的概念,体现了看待线程同步的不同角度。在java和数据库中都有实际应用。对于一个数据的并发操作悲观认为,自己在使用数据的时候一定有别的线程来修改数据,因而在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是悲观乐观认为,自己在使用数据的时候不会有别的线程修
# Java中的乐观 在并发编程中,如何有效地管理资源的并发访问是一个具有挑战性的任务。乐观(Optimistic Locking)是一种常见的协调并发的策略,它允许多个线程并行读取资源,只有在更新时才进行冲突检测,从而减少了的竞争。本文将介绍Java中的乐观及其实现方式,并提供代码示例以便于理解。 ## 乐观机制 乐观基于一个假设,即在大多数情况下并发操作是无冲突的,因此它会在
原创 7月前
83阅读
目录1 乐观/悲观1.1 乐观1.2 悲观2 独享/共享3 互斥/读写4 可重入5 公平/非公平6 分段7 偏向/轻量级/重量级8 自旋1 乐观/悲观  乐观与悲观并不是特指某两种类型的,是人们定义出来的概念或思想,主要是指看待并发同步的角度。  乐观:顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在
何谓乐观和悲观乐观对应于生活中乐观的人总是想着事情往好的方向发展,悲观对应于生活中悲观的人总是想着事情往坏的方向发展。这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人。悲观 - 共享资源每次只给一个线程使用,其他线程阻塞,用完后再把资源转让给其他线程总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次拿数据的时候都会上锁,等到处理完成后再释放。这样别人想拿这个数据
java乐观:CAS(Compare And Swap)是一种常见的“乐观”,大部分的CPU都有对应的汇编指令,它有三个操作数:内存地址V,旧值A,新值B。只有当前内存地址V上的值是A,B才会被写到V上,否则操作失败。public class SimulatedCAS {   private int value;      public synchronized int get() { ret
转载 2023-09-23 20:48:29
54阅读
一、悲观 总是假设最坏的情况,每次取数据时都认为其他线程会修改,所以都会加(悲观),不加锁就会出现缓存一致性问题。一旦加锁,不同线程同时执行时,只能有一个线程执行,其他的线程在入口处等待,直到被释放。悲观锁在MySQL、Java有广泛的使用MySQL的读、写、行Java的synchronized,ReentrantLock关键字二、乐观 乐观顾名思义就是在操作时很乐观,认为操作
文章目录都分类什么是悲观乐观悲观乐观开销对比 都分类什么是悲观乐观乐观对应于生活中乐观的人总是想着事情往好的方向发展,悲观对应于生活中悲观的人总是想着事情往坏的方向发展。这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人。悲观总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到(共享资源
前言  本文章主要针对像我一样代码只写了小几千行的小白,快速地了解锁的概念。文章90%摘自别处,是一种整理!!不是自己写的!!,不涉及底层数据结构层面的操作,属于比较容易理解的。相信入门的你,看那些大佬写的深层次东西也看不懂。也是为了自己面试复习准备。的分类从宏观上分类,分为悲观乐观乐观   乐观是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会
1. 乐观 和 悲观乐观与悲观是一种广义上的概念,体现了看待线程同步的不同角度。在Java和数据库中都有此概念对应的实际应用。先说概念。对于同一个数据的并发操作,悲观认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是悲观。而乐观认为自己在使用数据时不会有别的线程修
题主在阅读《实战Java高并发程序设计》一书时,了解到了Java的相关概念,在此记录下来以加深对其的理解,Java中的分为两种即为悲观乐观,那么何为悲观乐观呢? 点击查看原文乐观与悲观悲观是我们代码经常用到的,比如说Java中的synchronized和ReentrantLock等独占就是悲观思想的实现,它总是假设别的线程在拿数据的时候都会修改数据,所以在每次拿到数据的
转载 2023-11-19 10:14:01
116阅读
1、前言之前好几次看到有人在面经中提到了乐观与悲观,但是一本《Java Concurrency In Practice》快看完了都没有见到过这两种,今天终于在第15章发现了它们的踪迹。15.2 Hardware support for concurrencyExclusive locking is a pessimistic technique—it assumes the worst (i
1.乐观乐观的实现方式一般有两种:基于版本号的乐观。在每个数据表中添加一个版本号字段,当查询数据时,把版本号一起查询出来。在更新数据时,检查当前记录的版本号是否与查询时的版本号相等,如果相等,则说明此时没有其他线程修改该记录,可以更新,并把版本号加 1;如果不相等,则说明其他线程已修改了该记录,需要重新查询并重试操作。基于时间戳的乐观。在每个数据表中添加一个时间戳字段,记录最后修改时间。在
什么是悲观乐观悲观: 悲观就是每次拿数据的时候就会以为别人在修改,持有一种悲观的态度,所以每次在拿数据的时候都会上锁,Java中synchronized和ReentrantLock等独占就是悲观思想的实现,每次拿数据都是一个线程,完成后在进行其他进程。传统的数据库也用到了很多的机制,比如行、表、读、写等,他们在操作的时候总是先给上锁,对外界的访问持保守态度,保持自身的排他性
        今天我们来聊下线程中的悲观乐观,首先提到"悲观","乐观"提到这两个名词,大家可能会先想到数据库。注意啦,我们这里讲的是多线程中的,而不是数据库中的(没听过的童鞋,可以百度了解下。大概思想同线程中的悲乐思想差不多)。在Java中,常用Api提供的就是synchronized和lock,以及CAS。不知道大家有没有这
转载 2023-09-30 15:03:25
152阅读
数据中的分为两类:悲观乐观还有表级、行级 表级例如: SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表,但不能更新删除 SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除 行级例如: select * from table_name where id = 1 for upda
乐观与悲观是一种广义上的概念,体现了看待线程同步的不同角度。在Java和数据库中都有此概念对应的实际应用。Java中synchronized关键字和Lock的实现类是悲观,线程一旦得到,其他需要的线程就挂起的情况就是悲观。 这种会让没有得到资源的线程进入阻塞状态,而后在争夺到资源后恢复为运行状态,这个过程中涉及到操作系统用户模式和内核模式的转换,代价比较高。乐观锁在Java中是通
转载 2023-06-02 21:44:22
130阅读
  • 1
  • 2
  • 3
  • 4
  • 5