写点什么

Java 教程百度云最新版,极客时间 vip 年卡,Java 开发者面试如何系统复习

用户头像
极客开源
关注
发布于: 刚刚

线程是否要锁住同步资源

  • 锁住?悲观锁

  • 不锁住?乐观锁

锁住同步资源失败 线程是否要阻塞

  • 阻塞

  • 不阻塞自旋锁,适应性自旋锁

多个线程竞争同步资源的流程细节有没有区别

  • 不锁住资源,多个线程只有一个能修改资源成功,其它线程会重试无锁

  • 同一个线程执行同步资源时自动获取资源偏向锁

  • 多个线程竞争同步资源时,没有获取资源的线程自旋等待锁释放?轻量级锁

  • 多个线程竞争同步资源时,没有获取资源的线程阻塞等待唤醒?重量级锁

4.多个线程竞争锁时是否要排队

  • 排队公平锁

  • 先尝试插队,插队失败在排队非公平锁

一个线程的多个流程能不能获取同一把锁

  • 能?可重入锁

  • 不能非可重入锁

多个线程能不能共享一把锁

  • 能?共享

  • 不能排他锁

悲观锁与乐观锁

悲观锁与乐观锁时一种广义的概念,体现的是看待线程同步的不同角度。

悲观锁

悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,在获取数据的时候会先加锁,确保数据不会被别的线程修改。 锁实现:synchronized?接口Lock的实现类 适用场景:写操作多,先加锁可以保证写操作时数据正确。

乐观锁

乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。 锁实现:CAS算法,例如AtomicInteger类的原子自增时通过CAS自旋实现。 适用场景:读操作较多,不加锁的特点能够使其读操作的性能大幅度提升。 乐观锁的执行流程: 线程 A 获取到数据以后直接操作,操作完数据以后准备更新同步资源,更新之前会先判断内存中同步资源是否被更新: 1.如果没有被更新,更新内存中同步资源的值。 2.如果同步资源被其他线程更新,根据实现方法执行不同的操做(报错 or 重试)。

CAS 算法

全名:Compare And Swap(比较并交换) 无锁算法:基于硬件原语实现,在不使用锁(没有线程被阻塞)的情况下实现多线程之间的变量同步。 jdk 中的实现:java.util.concurrent 包中的原子类就是通过 CAS 来实现了乐观锁。 算法涉及到的三个操作数:


需要读写的内存值V进行比较的值A要写入的新值的B
复制代码


CAS 存在的问题

1.ABA 问题 线程 1 准备用 CAS 将变量的值由 A 替换为 B,在此之前,线程 2 将变量的值由 A 替换为 C,又由 C 替换为 A,然后线程 1 执行 CAS 时发现变量的值仍然为 A,所以 CAS 成功。但实际上这时的现场已经和最初不同了,尽管 CAS 成功,但可能存在潜藏的问题。 举例:一个小偷,把别人家的钱偷了之后又还了回来,还是原来的钱吗,你老婆出轨之后又回来,还是原来的老婆吗?ABA 问题也一样,如果不好好解决就会带来大量的问题。最常见的就是资金问题,也就是别人如果挪用了你的钱,在你发现之前又还了回来。但是别人却已经触犯了法律。 但是 jdk 已经解决了这个问题。 想追下源码来着,但是一追发现直接到 c 了。


2.循环时间长开销大 3.只能保证一个共享变量的原子操作

文末

我将这三次阿里面试的题目全部分专题整理出来,并附带上详细的答案解析,生成了一份 PDF 文档


  • 第一个要分享给大家的就是算法和数据结构



  • 第二个就是数据库的高频知识点与性能优化



  • 第三个则是并发编程(72 个知识点学习)



  • 最后一个是各大 JAVA 架构专题的面试点+解析+我的一些学习的书籍资料



还有更多的 Redis、MySQL、JVM、Kafka、微服务、Spring 全家桶等学习笔记这里就不一一列举出来


本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

用户头像

极客开源

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
Java教程百度云最新版,极客时间vip年卡,Java开发者面试如何系统复习