学习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型
```

具体方法可以看如图所示

本文分享自微信公众号 - LuckQI(YoungRUIQ)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-06-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术达人

NAT穿透技术详解

传统的C/S结构是每个客户端均知道中心化的SERVER,由客户端主动与SERVER进行通信。

55940
来自专栏青蛙要fly的专栏

Android技能树 — 网络小结(2)之TCP/UDP

介于自己的网络方面知识烂的一塌糊涂,所以准备写相关网络的文章,但是考虑全部写在一篇太长了,所以分开写,希望大家能仔细看,最好可以指出我的错误,让我也能纠正。

17230
来自专栏Laoqi's Linux运维专列

LVS负载均衡中arp_ignore和arp_annonuce参数配置的含义

13030
来自专栏代码世界

计算机网络基础

计算机网络的发展及基础网络概念 问题:网络到底是什么?计算机之间是如何通信的? 早期 : 联机 ?  以太网 : 局域网与交换机 ? 广播   主机之间“一对所...

407120
来自专栏Golang语言社区

TCP、UDP、IP 协议分析

互连网早期的时候,主机间的互连使用的是NCP协议。这种协议本身有很多缺陷,如:不能互连不同的主机,不能互连不同的操作系统,没有纠错功能。为了改善这种缺点,大牛弄...

51330
来自专栏Web 开发

涨姿势 – 不一样的服务端长连接方案 – 客户端代理

传统的 LAMP 架构,PHP-CGI  这种方式是很难处理长连接的。要么写死循环的方式来握住请求,要么使用 swoole 这种,通过 C 拓展来支持。

20920
来自专栏散尽浮华

svn代码发版的脚本分享

背景:开发将其代码放到svn里面,如何将修改后存放到svn里的代码发布到线上? 简单做法:写个shell脚本,用于代码发版。比如开发的代码存放svn的路径是:s...

249100
来自专栏用户2442861的专栏

高性能网络编程2----TCP消息的发送

http://blog.csdn.net/russell_tao/article/details/9370109

17120
来自专栏土豆专栏

计算机网络基础知识整理--运输层

从IP层来说,通信的两端是两个主机。IP数据报的首部明确地标志了这两个主机的IP地址。我们需要知道,真正进行通信的实体是在主机中的进程,是这个主机中的一个进程和...

660120
来自专栏Golang语言社区

Golang进阶——TCP网络编程详解

介绍 Golang是谷歌设计开发的语言,在Golang的设计之初就把高并发的性能作为Golang的主要特性之一,也是面向大规模后端服务程序。在服务器端网络通信是...

79670

扫码关注云+社区

领取腾讯云代金券