
面试
文章平均质量分 69
这个名字先用着
这个作者很懒,什么都没留下…
展开
-
redis内存淘汰策略
redis缓存淘汰原创 2022-06-23 17:09:27 · 472 阅读 · 0 评论 -
Redis分布式锁的正确实现方式(Java版)
总结:原创 2022-05-18 19:17:35 · 4090 阅读 · 2 评论 -
java线程池详解
目录一、线程池的优势:二、线程池的架构图:三、Executors工具类中几个重点的创建线程池的方法:一、线程池的优势:为何要用线程池,总的来说有以下几个原因:总体来说,线程池有如下的优势:(1)降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。(2)提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。(3)提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。二、线程池原创 2022-03-28 22:56:03 · 1300 阅读 · 0 评论 -
生产者消费者模式三种实现方式
1.什么是生产者消费者模式:生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。纵观大多数设计模式,都会找一个第三者出来进行解耦,如工厂模式的第三者是工厂类,模板模式的第三者是模板类。在学习一些设计模式的过程中,如果先找到原创 2022-03-28 18:20:18 · 19472 阅读 · 4 评论 -
Synchronized和Lock的区别
原始构成:synchronized 是关键字属于 JVM 层面,monitorenter(底层是通过 monitor 对象来完成, 其实 wait/notify 等方法也依赖于 monitor 对象只有在同步块或方法中才能调 wait/notify 等方法)monitorexitLock 是具体类(java.util.concurrent.locks.Lock)是 api 层面的锁使用方法:synchronized 不需要用户去手动释放锁,当 synchronized 代码执..原创 2022-03-25 09:18:16 · 866 阅读 · 0 评论 -
JUC之阻塞队列
1. 什么是阻塞队列:阻塞队列(BlockingQueue)是这样的一种数据结构,它是一个队列(类似于一个List), 是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。当阻塞队列为空时,从队列中获取元素的操作将会被阻塞。当阻塞队列为满时,从队列里添加元原创 2022-03-23 23:23:21 · 2514 阅读 · 0 评论 -
JUC之自旋锁
自旋锁的提出背景:由于在多处理器环境中某些资源的有限性,有时需要互斥访问(mutual exclusion),这时候就需要引入锁的概念,只有获取了锁的线程才能够对资源进行访问,由于多线程的核心是CPU的时间分片,所以同一时刻只能有一个线程获取到锁。那么就面临一个问题,那么没有获取到锁的线程应该怎么办?通常有两种处理方式:一种是没有获取到锁的线程就一直循环等待判断该资源是否已经释放锁,这种锁叫做自旋锁,它不用将线程阻塞起来(NON-BLOCKING);还有一种处理方式就是把自己阻塞起来,等待重新调度请求,原创 2022-03-21 18:33:53 · 862 阅读 · 0 评论 -
java并发编程之CAS透彻理解
那什么是CAS呢?CAS,compare and swap,即比较并交换源码:CAS底层:原创 2022-03-19 11:43:58 · 208 阅读 · 0 评论 -
synchronized 和 volatile区别
synchronized 和 volatile 的区别是什么?synchronized 表示只有一个线程可以获取作用对象的锁,执行代码,阻塞其他线程。volatile 表示变量在 CPU 的寄存器中是不确定的,必须从主存中读取。保证多线程环境下变量的可见性;禁止指令重排序。区别volatile 是变量修饰符;synchronized 可以修饰类、方法、变量。volatile 仅能实现变量的修改可见性,不能保证原子性;而 synchronized 则可以保证变量的修改可见性和原子性。volatil原创 2022-03-19 07:46:04 · 155 阅读 · 0 评论 -
AQS介绍
AQS是什么:代码演示:原创 2022-03-17 19:36:14 · 1390 阅读 · 1 评论 -
线程的等待和唤醒机制
三种让线程等待和唤醒的方法:LockSupport类可以阻塞当前线程以及唤醒指定被阻塞的线程:第一种方式:synchronized + wait + notify:即使用Object中的wait方法让线程等待,使用Object中的notify方法唤醒线程:代码演示:存在的弊端:问题一:报异常,证明 wait + notify不能脱离synchronized 代码块或者方法。问题二:被阻塞的结果,证明wait + notify顺序不能颠倒,只能先等待后唤醒。等待中的线程才能.原创 2022-03-15 15:37:24 · 6703 阅读 · 0 评论 -
volatile关键字
volatile关键字的两层语义:一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:1)禁用缓存,保证内存可见性。保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,它会保证修改的值会立即被更新到主存,这新值对其他线程来说是立即可见的。2)禁止指令重排。指令重排:处理器为了提高程序运行效率,处理器根据指令之间的数据依赖性,可能会对指令进行重排序,单线程下可以保证程序最终执行结果和代码顺序执行的结果是一致的,但是多线程下有可能出原创 2022-03-08 12:16:48 · 124 阅读 · 0 评论 -
JUC之读写锁/独占锁(写锁)和共享锁(读锁)
乐观锁悲观锁:写锁的死锁:原创 2022-03-06 22:03:58 · 432 阅读 · 0 评论 -
JUC之Semaphore信号灯/信号量
目录Semaphore概念:代码演示Semaphore:Semaphore实现原理:Semaphore概念:1、Semaphore 是什么:Semaphore 通常我们叫它信号量, 可以用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用资源。可以把它简单的理解成我们停车场入口立着的那个显示屏,每有一辆车进入停车场显示屏就会显示剩余车位减1,每有一辆车从停车场出去,显示屏上显示的剩余车辆就会加1,当显示屏上的剩余车位为0时,停车场入口的栏杆就不会再打开,车辆就无法进入停车场了原创 2022-03-06 20:30:17 · 314 阅读 · 0 评论 -
JUC之常用辅助类CyclicBarrier
目录一、CyclicBarrier介绍:二、CyclicBarrier构造方法:三、维护锁状态逻辑:四、CyclicBarrier的重复使用:五、CyclicBarrier代码:一、CyclicBarrier介绍:从字面上的意思可以知道,这个类的中文意思是“循环栅栏”。大概的意思就是一个可循环利用的屏障。官网解释:允许一组线程全部等待彼此达到共同屏障点的同步辅助。循环阻塞在涉及固定大小的线程方的程序中很有用,这些线程必须偶尔等待彼此。屏障被称为循环 ,因为它可以在等待的线程被释放之后重新使用。原创 2022-03-06 20:13:16 · 160 阅读 · 0 评论 -
JUC之常用辅助类CountDownLatch
CountDownLatch:1.背景:countDownLatch是在java1.5被引入,跟它一起被引入的工具类还有CyclicBarrier、Semaphore、concurrentHashMap和BlockingQueue。存在于java.util.cucurrent包下。2.概念:countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用).原创 2022-03-06 19:25:44 · 274 阅读 · 0 评论 -
高并发编程之死锁
演示死锁:原创 2022-03-05 17:25:52 · 462 阅读 · 0 评论 -
可重入锁和不可重入锁详解
可以进行循环递归调用,因为可以重新进去调用原创 2022-03-05 12:31:10 · 7914 阅读 · 0 评论 -
JUC之线程安全的集合
当一边往集合添加数据,一边取数据的时候,会出现并发修改异常;vector:所有方法都是sync修饰的方法二:方法三:工作中常用:原创 2022-03-04 18:41:01 · 2498 阅读 · 0 评论 -
JUC之线程通信
Java多线程的wait()方法和notify()方法这两个方法是成对出现和使用的,要执行这两个方法,有一个前提就是,当前线程必须获其对象的monitor(俗称“锁”),否则会抛出IllegalMonitorStateException异常,所以这两个方法必须在同步块代码里面调用。wait():阻塞当前线程notify():唤起被wait()阻塞的线程...原创 2022-03-04 11:19:07 · 517 阅读 · 0 评论 -
String的intern方法
intern方法作用:简单总结就是:有,直接引用,没有,新建加入。在我们使用System.out.中的System类的时候,就默认加载了Version类考点:是否读过这些经典书原创 2022-03-03 19:11:02 · 1045 阅读 · 0 评论 -
HashMap 与 HashTable 的区别
HashMap 与 HashTable 有什么区别?线程安全: HashMap 是非线程安全的,HashTable 是线程安全的;HashTable 内部的方法基本都经过 synchronized 修饰。(如果你要保证线程安全的话就使用 ConcurrentHashMap 吧!);效率: 因为线程安全的问题,HashMap 要比 HashTable 效率高一点。另外,HashTable 基本被淘汰,不要在代码中使用它;对Null key 和Null value的支持: HashMap 中,null原创 2022-03-03 13:31:00 · 392 阅读 · 1 评论 -
二叉树数据结构
二叉树代码演示遍历:原创 2022-02-24 19:25:43 · 274 阅读 · 0 评论 -
HashMap是怎么解决哈希冲突的
简单总结一下HashMap是使用了哪些方法来有效解决哈希冲突的:使用拉链法(使用链表)来链接拥有相同hash值的数据;使用2次扰动函数(hash函数)来降低哈希冲突的概率,使得数据分布更平均;引入红黑树进一步降低遍历的时间复杂度,使得遍历更快;什么是哈希函数?Hash,一般翻译为“散列”,也有直接音译为“哈希”的,这就是把任意长度的输入通过散列算法,变换成固定长度的输出,该输出就是散列值(哈希值);这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输原创 2022-02-24 15:16:22 · 1267 阅读 · 0 评论 -
HashMap底层实现原理
HashMap中的put()和get()的实现原理:1、map.put(k,v)实现原理:(1)首先将k,v封装到Node对象当中(节点)。(2)然后它的底层会调用K的hashCode()方法得出hashcode值。(3)通过哈希表函数/哈希算法,将hashcode值转换成数组的下标,下标位置上如果没有任何元素,就把Node添加到这个位置上。如果说下标对应的位置上有链表。此时,就会拿着k和链表上每个节点的k进行equal。如果所有的equals方法返回都是false,那么这个新的节点将被添加到链原创 2022-02-24 13:12:41 · 505 阅读 · 0 评论 -
hashcode方法和hash方法的区别
目录hashcode概念:hashcode作用:hashcode应用场景(重点,一般面试可能会问到):Hash函数:Hash函数的应用场景:hashmap源码解析(jdk1.8):hashcode概念:根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为(hashcode)。hashcode方法是Object中的一个方法,我们的String,Integer,等都重写了此方法。且重写规则不同。如Integer的重写hashcode方法:public原创 2022-02-24 12:10:48 · 1335 阅读 · 0 评论 -
哈希表/散列表数据结构
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。哈希冲突也叫哈希碰撞;开放地址法中(数组一个位置存一个元素),如果元素位置顺移后,原有数组位置不够了,就需要扩充数组大小,为了减少hash冲突而扩充数组容量,可能造成内存的浪费。...原创 2022-02-23 10:47:28 · 606 阅读 · 0 评论 -
ArrayList 和 Vector 的区别是
ArrayList 和 Vector 的区别是:相同点:这两个类都实现了 List 接口(List 接口继承了 Collection 接口),他们都是有序集合,list接口下有三个实现类:ArrayList,LinkedList,Vector.不同点:线程安全:Vector 使用了 Synchronized 来实现线程同步,是线程安全的,而 ArrayList 是非线程安全的。性能:ArrayList 在性能方面要优于 Vector。扩容:ArrayList 和 Vector 都会根据实际的需原创 2022-02-22 18:09:40 · 203 阅读 · 0 评论 -
java中list,set,map集合的区别
java中list,set,map集合的区别:List:可以允许重复的对象。可以插入多个null元素。是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。Set:不允许重复对象无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparato原创 2022-02-22 17:58:17 · 208 阅读 · 0 评论 -
ArrayList 和 LinkedList 的区别-详细版
ArrayList 和 LinkedList 的区别是什么?数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现。随机访问效率:ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据 存储方式,所以需要移动指针从前往后依次查找。增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为 ArrayList 增删操作要影响数组内的其原创 2022-02-21 18:43:35 · 1215 阅读 · 0 评论 -
集合框架底层数据结构总结
集合框架底层数据结构总结:Collection:List:ArrayList:Object数组Vector:Object数组LinkedList:双向链表(JDK1.6之前为循环链表,JDK1.7取消了循环)Set:HashSet(无序,唯一):基于HashMap实现的,底层采用HashMap来保存元素LinkedHashSet:LinkedHashSet继承于HashSet,并且其内部是通过LinkedHashMap来实现的。TreeSet(有序,唯一):红黑树(自平衡的排序二叉树)。原创 2022-02-21 18:13:57 · 156 阅读 · 0 评论 -
List,Set,Map区别
Java 容器分为 Collection 和 Map 两大类,Collection集合的子接口有Set、List、Queue三种子接口。我们比较常用的是Set、List,Map接口不是collection的子接口。Collection集合主要有List和Set两大子接口:List:一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入多个null元素,元素都有索引。常用的实现类有 ArrayList、LinkedList 和 Vector。Set:一个无序(存入和取出顺序有可能不一原创 2022-02-21 15:43:59 · 253 阅读 · 0 评论 -
数组和集合的区别
集合和数组的区别:数组是固定长度的;集合可变长度的。数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据类型。数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型。使用集合框架的好处:容量自增长;提供了高性能的数据结构和算法,使编码更轻松,提高了程序速度和质量;允许不同 API 之间的互操作,API之间可以来回传递集合;可以方便地扩展或改写集合,提高代码复用性和可操作性。通过使用JDK自带的集合类,可以降低代码维护和学习新API成本。原创 2022-02-21 15:30:22 · 591 阅读 · 0 评论 -
String、StringBuffer与StringBuilder之间区别和使用场景
区别:String是final修饰的,不可变,底层使用final char[]数组存储数据。每次操作都会产生新的String对象,这样会导致内存浪费的比较多。StringBuffer和StringBuilder是可变字符串,都是在原对象上进行操作,不会生成新的对象。StringBuffer是线程安全的(StringBuffer方法都是synchronized修饰的),StringBuilder是线程不安全的。StringBuilder速度更快,StringBuffer慢一点。原创 2022-02-21 14:28:57 · 384 阅读 · 0 评论 -
java反射
反射:什么是反射机制?JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。静态编译和动态编译:静态编译:在编译时确定类型,绑定对象动态编译:运行时确定类型,绑定对象反射机制优缺点:优点: 运行期类型的判断,动态加载类,提高代码灵活度。缺点: 性能瓶颈:反射相当于一系列解释操作,通知 JVM 要做的事情,性能比直接的java代码要慢很多。原创 2022-02-20 16:23:37 · 112 阅读 · 0 评论 -
单例设计模式的饿汉式和懒汉式
单例模式原创 2022-02-20 15:37:10 · 213 阅读 · 0 评论 -
BIO,NIO,AIO 的区别
BIO,NIO,AIO 有什么区别?简答:BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单、使用方便,并发处理能力低,数据的读取写入必须阻塞在一个线程内等待其完成。NIO:Non IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式。AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,原创 2022-02-20 13:54:07 · 596 阅读 · 0 评论 -
java的内部类
目录内部类什么是内部类?内部类的分类有哪些?静态内部类:成员内部类:局部内部类:匿名内部类:内部类的优点:内部类有哪些应用场景:局部内部类和匿名内部类访问局部变量的时候,为什么变量必须要加上final?内部类相关,看程序说出运行结果内部类什么是内部类?在Java中,可以将一个类的定义放在另外一个类的定义内部,这就是内部类。内部类本身就是类的一个属性,与其他属性定义方式一致。内部类的分类有哪些?内部类可以分为四种:成员内部类(其实包含静态内部类和非静态内部类)、局部内部类、匿名内部类和静态内部原创 2022-02-20 11:13:23 · 635 阅读 · 1 评论 -
静态变量与普通变量区别
静态变量与普通变量区别:static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。还有一点就是static成员变量的初始化顺序按照定义的顺序进行初始化。静态变量和实例变量区别:静态变量: 静态变量由于不属于任何实例对象,属于类的,所以在内存中只会有一份,在类的加载过程中,JVM只为静态变量分配一次内存空间。实例变量原创 2022-02-20 09:55:08 · 2055 阅读 · 0 评论 -
成员变量和局部变量的区别
成员变量与局部变量的区别有哪些变量定义:变量:在程序执行的过程中,在某个范围内其值可以发生改变的量。从本质上讲,变量其实是内存中的一小块区域成员变量和局部变量的区别:定义位置:成员变量:类内方法外定义的变量局部变量:类的方法中定义的变量。作用域:成员变量:针对整个类有效。局部变量:只在方法内,语句体内有效。存储位置:成员变量:随着对象的创建而存在,随着对象的消失而消失,存储在堆内存中。局部变量:在方法被调用,或者语句被执行的时候存在,存储在栈内存中。当方法调用完,或者语句结束后,就自原创 2022-02-20 09:40:33 · 190 阅读 · 0 评论