java-乐观锁与悲观锁

简介: java 乐观锁 悲观锁

我们今天就来了解一下锁中的乐观锁和悲观锁。

在面试中,如果是Java后天研发的工程师,很有可能会考到这一个知识点。所以今天也就来说下这个。

两者的概念

乐观锁

  • 根据表面上来看每次去拿数据的时候认为别人都不会修改。所以不会上锁,有着更宽松的锁机制,减少了性能的开销。

  • 在更新的时候会根据版本号进行判断是否有程序去修改这个数据,例如版本号等机制,使用版本号的机制在进行数据提交的时候,如果版本号大于对应的版本号那么进行更新,否则不进行更新。

  •  在大多数情况下乐观锁使用在读多的应用上。在java中我们所了解的atomic包中,常用的线程安全的变量是使用的该锁机制。

  • 乐观锁不能解决脏读问题

悲观锁

  • 相对乐观锁来说,悲观锁具有强烈的独占和排他特性。该锁机制总是假设最坏的情况,每次去拿数据的时候都会认为别人会修改,所以在取数据的时候会进行加锁的操作。在这样的情况下,别的程序代码操作,需要进行等待操作,直到其拿到锁为止。

java中实现该两种机制的锁

  在整个操作系统中,Cpu是分片操作的,在程序的执行过程中,会进行线程间的切换,也就是cpu的切换。Cpu的切换是很耗费时间,所以我们如果想减少CPU的切换,可以让某个线程一直持有该CPU,所以可以采用循环的方式来实现。

悲观锁

   我们Java中使用的synchronized 就是一种典型的悲观锁的实现,该锁是拥有独占性,和排他性保证了线程 的安全,所以我们说synchronized是悲观锁。

  • 优点:对数据处理安全起到了安全的作用。

  • 缺点:

  1. 因为加锁 排他性,那么就会损耗性能,降低了并行性,增加了系统负载。

  2.  容易出现死锁的情况。 

乐观锁

   平常使用的CAS的安全操作类就属于乐观锁机制。还有我们经常说的自旋锁,轻量级锁,偏向锁这些也属于乐观锁。乐观锁为什么乐观,是因为减少了对CPU之间的切换,挂起,阻塞 ,唤醒等机制的操作造成的开销。所以在开销上,乐观锁更占一筹,减少了性能的损耗。建议对性能要求高,读请求多的使用该机制。

下面介绍下可以使用这些CAS操作一些类的使用

```
       AtomicInteger  one = new AtomicInteger();
       AtomicLong  atomicLong = new AtomicLong();
       AtomicReference student  = new AtomicReference<>();
       one.get() ; //获得值
       one.addAndGet(2) ;  //增加指定的值
       one.incrementAndGet();  //增加1
       one.getAndSet(0);  //先得到 原先值 然后在置为0
       one.longValue();  //转为 long型
```




转载:

原创: mengrui LuckQI










目录
相关文章
|
4月前
|
存储 安全 算法
java 悲观锁、乐观锁
java 悲观锁、乐观锁
27 0
|
6月前
|
算法 Java 数据库
Java 最常见的面试题:说一下乐观锁和悲观锁
Java 最常见的面试题:说一下乐观锁和悲观锁
|
9月前
|
Java
JAVA 锁:乐观锁、悲观锁?
JAVA 锁:乐观锁、悲观锁?
37 0
|
10月前
|
XML Java 数据格式
Java乐观锁实现文章点击量、收藏计数、点赞计数
当要更新一条记录的时候,希望这条记录没有被别人更新 乐观锁实现方式: 取出记录时,获取当前 version 更新时,带上这个 version 执行更新时, set version = newVersion where version = oldVersion 如果 version 不对,就更新失败
23103 8
深入理解CAS 乐观锁 | Java
深入理解CAS 乐观锁 | Java
|
安全 Java 程序员
乐观锁思想在JAVA中的实现——CAS
乐观锁思想在JAVA中的实现——CAS
152 0
乐观锁思想在JAVA中的实现——CAS
|
设计模式 安全 Java
AQS:Java 中悲观锁的底层实现机制
本文主要介绍了 1. AQS 的实现原理:同步阻塞队列 2. Condition 的实现原理:条件等待队列
133 0
AQS:Java 中悲观锁的底层实现机制
|
SQL NoSQL 关系型数据库
Java并发编程 - 乐观锁 & 悲观锁
Java并发编程 - 乐观锁 & 悲观锁
181 0
Java并发编程 - 乐观锁 & 悲观锁
每天一个知识点(十)什么是乐观锁、什么是悲观锁,两种锁在Java中的具体应用场景有哪些
乐观锁和悲观锁不是两种具体的锁,而是一种观念。 乐观锁:乐观锁认为对于同一个数据的并发操作,是不会发生修改的。在更新数据的时候,会采用尝试更新,不断重新的方式更新数据。乐观的认为,不加锁的并发操作是没有事情的 悲观锁:悲观锁认为对于同一个数据的并发操作,一定是会发生修改的,哪怕没有修改,也会认为修改。因此对于同一个数据的并发操作,悲观锁采取加锁的形式。
|
Java
【Java 并发编程】线程锁机制 ( 悲观锁 | 乐观锁 | CAS 三大问题 | ABA 问题 | 循环时间长问题 | 多个共享变量原子性问题 )
【Java 并发编程】线程锁机制 ( 悲观锁 | 乐观锁 | CAS 三大问题 | ABA 问题 | 循环时间长问题 | 多个共享变量原子性问题 )
179 0