乐观锁

java-Lock接口

余生颓废 提交于 2019-11-29 02:47:57
Lock的使用 代码: 结果: lock与synchronized的区别 lock 获取锁与释放锁的过程,都需要程序员手动的控制 Lock用的是乐观锁方式。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁实现的机制就 是CAS操作 synchronized托管给jvm执行 原始采用的是CPU悲观锁机制,即线程获得的是独占锁。独占锁意味着其他线程只能依靠阻塞来等待线程释放锁。 实现了lock接口的锁   Lock的方法 方法的具体意思:查看JDK中的方法注解 来源: https://www.cnblogs.com/woxbwo/p/11441282.html

乐观锁与悲观锁

天涯浪子 提交于 2019-11-28 23:06:31
锁 (Lock) 锁是一种保证数据安全的机制和手段,其并不是特定于某项技术的,其主要是通过在并发下控制多个操作的顺序执行,以此来保证数据安全地变动 例如在程序中,当多个线程修改共享变量时,可以给修改操作上锁 (syncronized) ;在数据库中,当多个用户修改表中同一数据时,我们可以给该行数据上锁 悲观锁 (Pessimistic Concurrency Control) 总是假设最坏的情况,每次取数据的时候都认为别人会修改,所以每次取数据都会加锁。这样别人在操作这条数据的时候,如果没有拿到锁,就会发生阻塞,操作就无法执行。 数据库中的行锁,表锁,读锁,写锁等都是悲观锁 乐观锁 (Optimistic Concurrency Control) 总是假设最好的情况,每次取数据的时候都认为别人不会修改数据,所以不对数据加锁。但是会在更新的时候判断一下在此期间别人有没有更新这个数据,判断可以使用版本号机制和 CAS 算法实现。 乐观锁通常是通过在表中增加一个版本 (version) 或时间戳 (timestamp) 来实现,其中版本最为常用. 事务从数据库中取数据时,会将该数据的版本也取出来 (v1) ,当事务对数据变动完毕需要提交至数据库时,会将之前取出的 v1 与数据的最新版本 v2 进行对比 v1 = v2 :说明数据变动期间没有其他事务对该数据进行修改

MySQL重要知识点/面试题总结

≯℡__Kan透↙ 提交于 2019-11-28 20:05:37
这篇文章是作者利用几天时间对MySQL知识点总结完善后的产物,可以用来回顾MySQL基础知识以及备战MySQL常见面试问题。 什么是MySQL? MySQL 是一种关系型数据库,在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展。阿里巴巴数据库系统也大量用到了 MySQL,因此它的稳定性是有保障的。MySQL是开放源代码的,因此任何人都可以在 GPL(General Public License) 的许可下下载并根据个性化的需要对其进行修改。MySQL的默认端口号是3306。 事务相关 什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行。 事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。 事物的四大特性(ACID)介绍一下? 原子性 : 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用; 一致性 : 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的; 隔离性 : 并发访问数据库时,一个用户的事务不被其他事务所干扰

乐观锁和悲观锁的区别

六月ゝ 毕业季﹏ 提交于 2019-11-28 17:57:20
悲观锁(Pessimistic Lock) 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。 乐观锁(Optimistic Lock) 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。 两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。 本质上

Java:CAS(乐观锁)

夙愿已清 提交于 2019-11-28 15:58:02
本文讲解CAS机制,主要是因为最近准备面试题,发现这个问题在面试中出现的频率非常的高,因此把自己学习过程中的一些理解记录下来,希望能对大家也有帮助。 什么是悲观锁、乐观锁?在java语言里,总有一些名词看语义跟本不明白是啥玩意儿,也就总有部分面试官拿着这样的词来忽悠面试者,以此来找优越感,其实理解清楚了,这些词也就唬不住人了。 synchronized是悲观锁,这种线程一旦得到锁,其他需要锁的线程就挂起的情况就是悲观锁。 CAS操作的就是乐观锁,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。 在进入正题之前,我们先理解下下面的代码: private static int count = 0; public static void main(String[] args) { for (int i = 0; i < 2; i++) { new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(10); } catch (Exception e) { e.printStackTrace(); } //每个线程让count自增100次 for (int i = 0; i < 100; i++) { count++; } } }).start(); } try{

事务丢失更新问题及乐观锁、悲观锁机制

ε祈祈猫儿з 提交于 2019-11-28 14:58:42
学习计划的第四天,仍然是对数据库事务方面进行学习。毕竟数据库操作在后端开发中有着举足轻重的作用。 那么,今天的学习内容是:事务丢失更新问题及乐观锁、悲观锁机制。 话不多说,进入正题。 什么是事务的丢失更新问题? 两个或多个事务更新同一行,但这些事务彼此之间都不知道其它事务进行的修改,因此第二个更改覆盖了第一个修改 。 这样说太抽象,举个例子:在数据库表中存在一条数据 id:100 name:张散 age:20 此时,两个管理员同时查询到了这条数据,此时,A管理员发现该数据的名字出错了,于是更新数据,将该数据改为 id:100 name:张三 age:20 然后A管理员提交了更新操作。这个时候,B管理员也发现该数据的年龄出错了,于是准备进行更改,但是B管理员根本就不知道A管理员进行了姓名的更改,于是B管理员进行了如下修改 id:100 name:张散 age:21 然后B管理员提交了更新操作。操作完成后,数据库表的数据变为了 id:100 name:张散 age:21 这时候问题就出现了,A管理员发现姓名出错进行了修改,而B管理员却把正确的名字给改了回去,B管理员的修改就覆盖了A管理员的修改,这种现象就是丢失更新。 贴张图方便大家理解。 那么该如何解决丢失更新问题呢?(丢失更新问题的解决) 悲观锁(Pessimistic Locking) 乐观锁(Optimistic Locking

Hibernate事务与并发问题处理(乐观锁与悲观锁) [转]

不问归期 提交于 2019-11-28 14:23:07
Hibernate事务与并发问题处理(乐观锁与悲观锁) 一、数据库事务的定义   数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作。事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。   1. 原子性(atomic) ,事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行   2. 一致性(consistent) ,事务在完成时,必须使所有的数据都保持一致状态。   3. 隔离性(insulation) ,由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。   4. 持久性(Duration) ,事务完成之后,它对于系统的影响是永久性的。 二、数据库事务并发可能带来的问题   如果没有锁定且多个用户同时访问一个数据库,则当他们的事务同时使用相同的数据时可能会发生问题。由于并发操作带来的数据不一致性包括:丢失数据修改、读”脏”数据(脏读)、不可重复读、产生幽灵数据: 假设数据库中有如下一张表:   1. 第一类丢失更新(lost update): 在完全未隔离事务的情况下

乐观锁的一种实现方式——CAS

早过忘川 提交于 2019-11-28 14:19:16
在 深入理解乐观锁与悲观锁 一文中我们介绍过锁。本文在这篇文章的基础上,深入分析一下乐观锁的实现机制,介绍什么是CAS、CAS的应用以及CAS存在的问题等。 线程安全 众所周知,Java是多线程的。但是,Java对多线程的支持其实是一把双刃剑。一旦涉及到多个线程操作共享资源的情况时,处理不好就可能产生线程安全问题。线程安全性可能是非常复杂的,在没有充足的同步的情况下,多个线程中的操作执行顺序是不可预测的。 Java里面进行多线程通信的主要方式就是共享内存的方式,共享内存主要的关注点有两个:可见性和有序性。加上复合操作的原子性,我们可以认为Java的线程安全性问题主要关注点有3个:可见性、有序性和原子性。 Java内存模型 (JMM)解决了可见性和有序性的问题,而锁解决了原子性的问题。这里不再详细介绍JMM及锁的其他相关知识。但是我们要讨论一个问题,那就是锁到底是不是有利无弊的? 锁存在的问题 Java在JDK1.5之前都是靠 synchronized 关键字保证同步的,这种通过使用一致的锁定协议来协调对共享状态的访问,可以确保无论哪个线程持有共享变量的锁,都采用独占的方式来访问这些变量。独占锁其实就是一种悲观锁,所以可以说 synchronized 是悲观锁。 悲观锁机制存在以下问题: 在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。

悲观锁与乐观锁

不问归期 提交于 2019-11-28 07:20:28
悲观锁(多写场景) 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁,即 共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程 。 传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。 乐观锁(多读场景) 总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS实现的。 乐观锁实现的两种方式 版本号机制 一般是在数据表中加上一个数据版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加1。当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读取到的version值为当前数据库中的version值相等时才更新,否则重试更新操作

乐观锁/悲观锁

不羁岁月 提交于 2019-11-28 05:56:01
原创转载请注明出处: https://www.cnblogs.com/agilestyle/p/11395841.html 悲观锁 总是假设最坏的情况,每次拿数据的时候都认为别人会修改,每次拿数据都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁,共享资源每次只给一个线程使用,其他线程阻塞,用完后才把资源转让给其他线程。 比如: RDBMS中的行锁、表锁等都是在操作之前先上锁 Java中synchronized和ReentrantLock等读占锁就是悲观锁思想的实现 乐观锁 总是假设最好的情况,每次拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。乐观锁用于多读的应用类型,这样可以提高吞吐量。 比如: Java中JUC.Atomic包下面的原子变量类就是使用了乐观锁的CAS实现 来源: https://www.cnblogs.com/agilestyle/p/11395841.html