自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 收藏
  • 关注

原创 JAVA-集合面试题总结

java集合面试题总结

2023-07-05 16:35:57 95

原创 JAVA-多线程面试题总结

java并发编程的面试题总结,一份在手,天下我有

2023-07-02 20:06:24 116

原创 kafka面试题总结

kafka常见面试题总结

2023-06-24 20:35:38 106

原创 JVM面试题总结

JVM的面试题总结,全部了解后则再也不怕问JVM的东西了

2023-06-18 17:15:58 109

原创 微服务面试题总结

针对微服务总结的一些面试题

2023-06-17 11:27:47 73

原创 框架-Spring面试题汇总

汇总了常见的Spring的面试题,全部搞懂,轻松搞定面试。

2023-06-13 22:24:36 65

原创 数据库面试题总结-MySQL

索引是帮忙MySQL高效获取数据的数据结构,主要用来提高数据检索的效率,降低数据库的IO成本,同时通过索引列对数据进行排序,降低排序的成本,从而降低CPU的消耗。通过二级索引找到对应的主键值,到聚集索引中查找整行数据,这个过程就是回表。覆盖索引是指select查询语句使用了索引,在返回的列,必须在索引中全部能够找到。如果使用id(主键)查询,会直接走聚集索引查询,一次索引扫描直接返回数据,性能高。

2023-06-10 22:04:45 70

原创 Redis面试题总结

掌握这些可以轻松应对redis面试

2023-05-31 22:05:23 67

原创 数据结构与算法---数组

但是有利也有弊,这两点也让数组很多其他操作变得非常低效,比如删除、插入一个元素,为了保证连续性,就需要做大量的数据搬迁工作。除了数组,链表、队列、栈等也是线性表结构。比如数组中存储a,b,c,d,e了5个元素,删除掉元素c,为了保持内存的连续性,需要搬迁数据。比如数组中存储a,b,c,d,e了5个元素,插入元素x,c,d,e 3个元素需要后移。正是由于这两点,数组拥有了一个堪称“杀手锏”的特性:“随机访问”。与它对立的概念是非线性表,比如二叉树、图、表等。如下直接访问第3个元素(数组是从0开始编号的)。

2023-04-29 11:29:09 54

原创 设计模式---单例模式

单例模式属于创建型模式,一个类有且只有一个实例,并且自行实例化向整个系统提供。

2023-04-27 20:15:18 41

原创 设计模式---简单工厂模式

简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,是由一个工厂对象决定创建出哪一种产品类的实例。

2023-04-23 20:57:23 37

原创 JAVA---CyclicBarrier

CountDownLatch是基于AQS实现的;有若干个线程,比如有4个线程,需要他们到达某一个点之后才能开始一起执行,假如有3个线程到达了这个点,还差1个线程没到达,此时3个线程都会进入等待状态,直到第4个线程也到达这个点之后,这4个线程才开始一起进行执行状态。System.out.println(System.currentTimeMillis() + " 线程1,准备好了。System.out.println(System.currentTimeMillis() + " 线程3,准备好了。

2023-04-10 20:58:34 44

原创 JAVA---CountDownLatch

使通过一个计数器来实现的,计数器的初始值是线程的数量,每当一个线程执行完毕之后,调用countDown方法,计算器值减1,当计数器的值为0时,表示所有线程都执行完毕了,等待的线程就可以恢复工作了。AQS的其中一个作用就是维护线程状态和获取释放锁。System.out.println("3个线程都执行完了,主线程可以恢复执行了。System.out.println("countDownLatch减1");System.out.println("countDownLatch减1");

2023-04-09 20:51:17 243

原创 JAVA---synchronized在JDK1.6中的优化

在JDK1.5版本推出了ReentrantLock,lock性能远高于synchronized,在JDK1.6版本,对synchronized做了大量优化。

2023-04-06 21:50:05 171

原创 JAVA---ThreadLocal应用场景及底层实现

如果在线程池中使用ThreadLocal会造成内存泄漏,因为当ThreadLocal对象使用完之后,应该要把设置的key和value,也就是Entry对象进行回收,但是线程池中的线程不会被收回,而线程对象是通过强引用指向ThreadLocalMap,ThreadLocalMap也是通过强引用指向Entry对象,线程不被回收,Entry对象也就不会被收回,从而出现内存泄漏。解决方法是使用ThreadLocal对象之后,手动调用ThreadLocal的remove方法,手动清除Entry对象。

2023-04-05 21:40:31 138

原创 JAVA---并发中的可见性、原子性、有序性

但是有可能线程A执行了第1条指令后,就发生了线程切换,线程A暂停执行,此处如果线程B也是执行i++,并且把3条指令都执行完了,那么线程B得到的结果i=2,然后线程A又切换回来继续执行,最终导致的线程A得到的结果也是i=2,正常来说i应该等于3的,这就是原子性问题。如上图,当线程A读取变量i时,会从内存中读取数据,并缓存一份在CPU1内部的高速缓存中,然后线程A将变量i的值修改为2,但是还没来得及回写到内存,此时线程B也读取变量i,也会从内存中读取,读到的变量i仍然为1,此时就出现了可见性问题。

2023-04-05 18:26:36 122

原创 JAVA---线程池中提交一个任务的流程

**/return;if (!else if (!​retry:for (;;) {​!!​for (;;) {= rs)......

2023-04-04 22:11:55 203

原创 SimpleDateFormat类的线程不安全

并发场景下,SimpleDateFormat类是线程不安全的,有的小伙伴会有疑问:我们一直使用SimpleDateFormat类来解析和格式化时间,也没发现问题啊。那是因为并发量还没有达到出现问题。

2023-04-03 22:43:15 40

原创 JAVA---Sychronized和ReentrantLock有什么不同

锁的是对象,锁信息保存在对象头中。Java中的一个关键字。需要手动加锁与释放锁。state标识锁状态。

2023-03-29 20:29:44 58

原创 JAVA---为什么不建议使用Executors来创建线程池

创建的队列是LinkedBlockingQueue,LinkedBlockingQueue是一个基于链表实现的阻塞队列,默认情况下,该阻塞队列的大小是Integer.MAX_VALUE,由于数值特别大,所以也被称为无界队列。如果使用该线程池执行任务,任务过多就会不断的添加到队列中,任务越多占用的内存就越多,最终有可能会耗尽内存,引起OOM。除了可能引起OOM之外,Executors来创建线程池也不能自定义线程的名字,不利于后续分析。所以建议直接使用ThreadPoolExecutor来创建线程池。

2023-03-29 20:28:26 188

原创 JAVA---ThreadPoolExecutor创建线程池

workQueue:一种阻塞队列,用来存储线程池等待执行的任务,均为线程安全。一般分为直接提交队列,有界任务队列,无界任务队列,优先任务队列等。keepAliveTime:最大线程数可以存活的时间,当线程中没有任务执行时,最大线程数会销毁一部分,最终保持核心线程数。LinkedBlockingQueue:一个由链表结构组成的无界阻塞队列(也可以设置队列大小,变成有界)unit:单位,和keepAliveTime配和使用,用于设定线程的存活时间,时间单位有以下7种可选。

2023-03-29 20:26:40 235

原创 JAVA---如何停止线程

最常用就是让线程的run方法结束,无论是return结束,还是抛异常结束,都可以。

2023-03-24 22:45:24 94 1

原创 JAVA---线程状态

时间等待状态(TIME_WAITING):调用sleep方法或者join方法,处于TIME_WAITING状态,会自动唤醒,无需手动唤醒。就绪/运行状态(Runnable):线程对象创建后,其他线程调用了该线程对象的start方法,从而启动该线程。等待(WAITING):调用wait方法就会处于WAITING状态,需要被手动唤醒。结束状态(TERMINATED):线程的run方法执行完了,线程生命周期结束了。新建状态(NEW):线程对象被创建后就进入了新建状态。

2023-03-24 22:00:08 64

原创 JAVA---线程实现的方式

2、FutureTask实现了Runnable,run方法调用callable。3、线程池创建的Worker也是实现了Runnable。其实,都是实现Runnable接口。1、Thread实现Runnable。

2023-03-24 20:54:10 40

原创 JAVA---可重入锁与不可重入锁

用一个计数器来记录锁被获取的次数,获取锁时,识别获取锁的线程是否为当前占据锁的线程,如果是再次获取成功,计数加1,释放锁时,计数减1,当计数器为0时才能释放锁。又名递归锁,指的是可重复可递归调用的锁,任意线程在获取锁之后能够再次获取该锁而不被锁所阻塞。ReentrantLock、synchronized修饰的方法或者代码段。

2023-03-24 19:27:07 135

原创 JAVA---共享锁与独占锁

ReentrantReadWriteLock,读锁是共享锁,写锁是独占锁。ReentrantLock、synchronized独享锁。是指该锁一次只能被一个线程所持有。是指该锁可以被多个线程所持有。

2023-03-24 19:25:53 208

原创 JAVA---公平锁与非公平锁

为了更高的吞吐量,非公平锁比较合适,因为节约很多线程切换时间,吞吐量自然就上去了;否则那就使用公平锁,大家公平使用。公平锁:每个线程获取锁的顺序是按照线程访问锁的先后顺序获取,最前面的线程总是先获取到锁。非公平锁:每个线程获取锁的顺序是随机的,并不遵循先来先得的规则,线程会竞争获取锁。ReentrantLock默认是非公平锁。

2023-03-24 19:25:12 103

原创 JAVA---悲观锁与乐观锁

比如一个变量V的初始值为A,有3个线程在处理,线程1和线程2同时处理,线程1将V的值修改为B,在线程2赋值检查之前,线程3又将V的值修改回了A,线程2在赋值检查时V的值虽然仍然是A,但是V的值已经被线程1和3修改过了。乐观锁总是假设最好的情况,认为自己在使用数据的时候不会有其他的线程来修改数据,无需加锁也无需等待,只是在提交数据的时候去检查有没有别的线程更新过数据。悲观锁总是假设最坏的情况,认为自己在使用数据的时候一定会有其他的线程来修改数据,因此在获取数据时先加锁,确保数据不会被别的线程修改。

2023-03-24 19:20:56 67

JAVA互联网企业面试真题

JAVA互联网企业面试真题

2023-04-25

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除