![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 96
纪莫
心中有光,人生总会晴朗。
展开
-
用Java如何设计一个阻塞队列,然后说说ArrayBlockingQueue和LinkedBlockingQueue
前言用Java如何设计一个阻塞队列,这个问题是在面滴滴的时候被问到的。当时确实没回答好,只是说了用个List,然后消费者再用个死循环一直去监控list的是否有值,有值的话就处理List里面的内容。回头想想,自己真是一个大傻X,也只有我才会这么设计一个阻塞队列(再说,我这也不是阻塞的队列)。结果自己面试完之后,也没去总结这部分知识,然后过了一段时间,某教育机构的面试又被问到类似的问题了,只不过是换了一个形式,“请用wait方法和notify方法实现一套有生产者和消费者的这种逻辑”。然后我就又蒙圈了,追悔莫原创 2021-06-15 18:32:07 · 1451 阅读 · 2 评论 -
Java中的线程池用过吧?来说说你是怎么理解线程池吧?
前言Java中的线程池用过吧?来说说你是怎么使用线程池的?这句话在面试过程中遇到过好几次了。我甚至这次标题都想写成【Java八股文之线程池】,但是有点太俗套了。虽然,线程池是一个已经被说烂的知识点了,但是还是要写这一篇用来加深自己的印象,但是想使用一个特殊的方式写出来。线程池使用线程池的目的先说一下我们为什么要使用线程池?线程是稀缺资源,不能频繁的创建。而且创建和销毁线程也是比较耗资源的。为了做到解耦,线程的创建与执行任务分开,方便对线程进行维护。为了复用,前面也说了创建和销毁线程比较耗资源原创 2021-05-06 07:03:54 · 286 阅读 · 1 评论 -
Redis的批量操作是什么?怎么实现的延时队列?以及订阅模式、LRU。
前言这次的内容是我自己为了总结Redis知识而扩充的,上一篇其实已经总结了几点知识了,但是Redis的强大,以及适用范围之广可不是单单一篇博文就能总结清的。所以这次准备继续总结,因为第一个问题,Redis的批量操作,是我在面试过程中被真实问到的,当时没答上来,也是因为确实没了解过Redis的批量操作。当时的问题,我还记得比较清晰:Redis执行批量操作的功能是什么?使用场景就是搞促销活动时,会做预缓存,会往缓存里放大批数据,如果直接放的话那么会很慢,怎么能提高效率呢?Redis的批量操作-管道(pip原创 2021-01-04 08:31:49 · 483 阅读 · 0 评论 -
你说一下Redis为什么快吧,怎么实现高可用,还有持久化怎么做的。
前言作为Java程序员,在面试过程中,缓存相关的问题是躲不掉的,肯定会问,例如缓存一致性问题,缓存雪崩、击穿、穿透等。说到缓存,那肯定少不了Redis,我在面试的时候也是被问了很多关于Redis相关的知识,但是Redis的功能太强大了,并不是一时半会儿能掌握好的,因为有些高级特性或是知识平时并不会用到。所以回答的不好,人家就会觉得你对自己平时使用的工具都没有了解,自然就凉凉了。其实很早就有这个打算,打算好好总结一下Redis的知识,但也是由于自己都没有好好的了解Redis呢,所以一直没有开始。这次准备慢原创 2020-12-28 23:54:46 · 203 阅读 · 0 评论 -
分布式事务了解吗?你们的多个服务间数据一致性解决方案是什么?
前言看标题就知道,这个又是个在面试中被问到的问题。这个问题其实是在我上次换工作的时候面试被问到过几次,之前也没在意过,觉得这个东西可能比较深奥,我直接说不理解吧。但是随着Java开发这个行业越来越卷,这次换工作一定要做好充足的准备。把之前落下的坑都填好,再出去受虐(面试)。什么是分布式事务我们都知道本地事务是有四个特性的:原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。本地事务的ACID一般都是靠关系型数据库来完成的,非关原创 2020-12-20 17:56:58 · 1764 阅读 · 3 评论 -
你说一下对Java中的volatile的理解吧,以及它是怎么保证可见性的。
前言volatile相关的知识其实自己一直都是有掌握的,能大概讲出一些知识,例如:它可以保证可见性;禁止指令重排。这两个特性张口就来,但要再往深了问,具体是如何实现这两个特性的,以及在什么场景下使用volatile,为什么不直接用synchronized这种深入和扩展相关的问题,就回答的不好了。因为volatile是面试必问的知识,所以这次准备把这部分也给啃掉。系统处理效率与Java内存模型在计算机中,每条程序指令都是在CPU中执行的,而CPU执行指令的数据都是临时存储在内存中的,但是CPU的执行速度原创 2020-11-05 23:56:07 · 913 阅读 · 1 评论 -
你来讲讲AQS是什么吧?都是怎么用的?
前言在Java面试的时候,多线程相关的知识是躲不掉的,肯定会被问。我就被问到了AQS的知识,就直接了当的问,AQS知道是什么吧,来讲讲它是怎么实现的,以及哪些地方用到了它。当时自己确实没有讲好,所以这次来总结一下这个知识点。什么是AQSAQS全称是AbstractQueuedSynchronizer,形如其名,抽象队列同步器。AQS定义了两种资源共享模式:独占式,每次只能有一个线程持有锁,例如ReentrantLock实现的就是独占式的锁资源。共享式,允许多个线程同时获取锁,并发访问共享资源,原创 2020-09-30 08:05:46 · 1167 阅读 · 1 评论 -
来说说缓存穿透、缓存击穿、缓存雪崩都是什么?怎么解决?
前言看到题目就知道了,这又是我在面试中遇到的,最近面试,把我的博文质量感觉都提上来了。面一次试感觉够我总结一周的,但还是每次都能遇到知识盲点,那以后就当面试总结是个扫盲的过程吧。缓存穿透面试的时候就被问到了这个问题,具体描述就是,正常的请求都是先请求到缓存(就当我们的缓存是Redis吧),如果缓存中存在数据,就直接返回,如果缓存中不存在请求的数据,就查询数据库,然后将查询到的数据再放到缓存中。那么如果现在有一堆的请求,在缓存中没有,数据库中也没有,怎么办?这种垃圾请求还特别多,而且因为是在数据库没有原创 2020-09-16 08:35:32 · 120 阅读 · 0 评论 -
synchronized底层是怎么实现的?
前言面试的时候有被问到,synchronized底层是怎么实现的,回答的比较浅,面试官也不是太满意,所以觉得要好好总结一下,啃啃这个硬骨头。synchronized使用场景我们在使用synchronized的时候都知道它是可以使用在方法上的也可以使用在代码块上的,那么使用在这两个地方有什么区别呢?synchronized用在方法上使用在静态方法上,synchronized锁住的是类对象。public class SynchronizedTest { /** * synchro原创 2020-09-15 22:09:23 · 351 阅读 · 0 评论 -
来讲讲你对ThreadLocal的理解
前言面试的时候被问到ThreadLocal的相关知识,没有回答好(奶奶的,现在感觉问啥都能被问倒),所以我决定先解决这几次面试中都遇到的高频问题,把这几个硬骨头都能理解的透彻的说出来了,感觉最起码就不是一轮游了。ThreadLocal介绍ThreadLocal是JDK1.2开始就提供的一个用来存储线程本地变量的类。ThreadLocal中的变量是在每个线程中独立存在的,当多个线程访问ThreadLocal中的变量的时候,其实都是访问的自己当前线程的内存中的变量,从而保证的变量的线程安全。我们一般在使原创 2020-09-10 23:05:28 · 170 阅读 · 2 评论 -
深入理解JVM(③)Java的锁优化
前言原创 2020-07-25 16:46:03 · 130 阅读 · 0 评论 -
深入理解JVM(③)再谈线程安全
前言我们在编写程序的时候,一般是有个顺序的,就是先实现再优化,并不是所有的牛P程序都是一次就写出来的,肯定都是不断的优化完善来持续实现的。因此我们在考虑实现高并发程序的时候,要先保证并发的正确性,然后在此基础上来实现高效。所以线程安全是高并发程序首先需要保证的。线程安全定义对于线程安全的定义可以理解为:当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那就称这个对象是线程原创 2020-07-15 23:21:35 · 195 阅读 · 0 评论 -
深入理解JVM(③)线程与Java的线程
前言我们都知道,线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源调度(内存地址、文件I/O等),又可以独立调度。线程的实现主流的操作系统都提供了线程实现,Jav语言则是提供了在不同硬件和操作系统平台下对线程操作的统一处理,每个已经调用过start()方法且还未结束的java.lang.Thread类的实例就代表这一个线程。其实Thread类与大部分的Java类库API有着显著差别,它的所有关键方法都被声明为Native。在Java中,原创 2020-07-11 12:05:50 · 307 阅读 · 0 评论 -
深入理解JVM(③)学习Java的内存模型
前言Java内存模型(Java Memory Model)用来屏蔽各种硬件和操作系统的内存访问差异,这使得Java能够变得非常灵活而不用考虑各系统间的兼容性等问题。定义Java内存模型并非一件容易的事情,从Java出生开始经过长时间的验证和修补,直至JDK5发布后Java内存模型才终于成熟、完善起来了。主内存与工作内存Java内存模型的主要目的是定义程序中各种变量的访问规则,即关注在虚拟机中把变量值存储到内存和从内存中取出变量值这样的底层细节。Java内存模型规定了所有变量都存储在主内存(Main原创 2020-07-09 08:12:19 · 271 阅读 · 0 评论