- 博客(9)
- 收藏
- 关注
原创 Java面试题:请谈谈Java中的volatile关键字?
线程1会随机修改这个变量的值,而线程2则根据这个变量的值来决定自己的行为。如果没有使用volatile关键字,那么可能会出现线程2在读取变量值时还没有获取到线程1的改变,从而导致错误的结果。不过要注意的是,虽然volatile关键字可以帮助我们避免一些常见的问题,但它并不能解决所有的多线程问题,对于一些复杂的情况,我们可能需要使用更高级的同步机制,如锁或原子类。但是,由于flag被声明为volatile,所以无论哪个线程修改了这个变量的值,另一个线程都会立即看到这个改变,从而保证了程序的正确性。
2024-06-20 17:17:31
421
原创 Java面试题:你知道Spring的IOC吗?那么,它为什么这么重要呢?
在上面的示例中,我们定义了一个ObjectContainer类,它包含了创建对象和注入对象的方法。同样是上面的例子,假如说Bean A需要修改,如果没有IOC的话,所有引用到A的其他Bean都需要感知这个逻辑,并且做对应的修改。来说,如果B要使用A,那还要 把c,d,e,f侈个类全都感知一遍,这显然是非常麻烦且不合理的。在类和类之间存在控制权,控制权指的是对象的创建和使用,比如有类A和类B,我们之前的做法是在A中调用B,那么控制权就在A中,这样做的耦合度较高,如果修改了 B,A也要做相应修改。
2024-06-18 16:30:20
797
原创 面试官:素有Java锁王称号的‘StampedLock’你知道吗?我:这什么鬼?
相比于传统读写锁多出来的乐观读是StampedLock比 ReadWriteLock 性能更好的关键原因。StampedLock 的乐观读允许一个写线程获取写锁,所以不会导致所有写线程阻塞,也就是当读多写少的时候,写线程有机会获取写锁,减少了线程饥饿的问题,吞吐量大大提高。不过,需要注意的是StampedLock不可重入,不支持条件变量 Condition,对中断操作支持也不友好(使用不当容易导致 CPU 飙升)。
2024-06-17 15:34:58
675
原创 Java面试题:细数ThreadLocal大坑,内存泄露本可避免
ThreadLocalMemoryLeakTest类中的main方法模拟了ThreadLocal的使用,并在使用后调用remove方法来清除ThreadLocal中的数据,然后强制进行垃圾回收并等待一段时间,最后检查对象是否被垃圾回收器回收。为了解决这个问题,我们需要确保在不再需要ThreadLocal中的数据时释放其占用的内存,从而避免内存泄露。然而,如果不正确使用,它也可能导致内存泄露。内存泄漏(Memory leak):指程序申请内存后,无法释放已申请的内存空间,内存泄漏的堆积终将导致内存溢出。
2024-06-14 15:35:36
1906
原创 面试官:这就是你理解的Java多线程基础?
如下图,可以通过 ThreadPoolExecutor 构造函数来创建线程池(推荐)。优先推荐使用 ThreadPoolExecutor 来创建线程池,在《阿里巴巴 Java 开发手册》中指出线程资源必须使用线程池来提供,不允许在应用中自行显示创建线程,也强制线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 构造函数的方式来创建线程池。
2024-06-12 15:39:34
1922
原创 面试准备不充分,被Java守护线程干懵了,面试官主打一个东西没用但你得会
OK,写到这里,关于守护线程的内容就讲完了,我们从什么是守护线程,守护线程的使用场景,优先级,注意事项等方面,进行了全面的介绍。其实说实话,在我们日后工作中,很少直接使用上守护线程,所以它看似没那么重要,但在很多Java多线程相关的书籍中绝对都有提及,很多小伙伴在学习的过程中认为这个点不重要,也就相当然的忽略了,但遇到变态的面试官,专门挑拣一些偏僻的知识点考你时,难免陷入尴尬,所以希望借助这个考题,大家能够在日后更细心的学习哈。结尾彩蛋我是啊哈,一个工作十四年经验的Java程序员!
2024-06-03 16:06:07
799
原创 当面试官问出“Unsafe”类时,我就知道这场面试废了,祖坟都能给你问出来!
学习过C或者C++的同学对于内存操作应该很熟悉了,在Java里我们是无法直接对内存进行操作的,我们创建的对象几乎都在堆内内存中存放,它的内存分配与管理都是JVM去实现,同时,在Java中还存在一个JVM管控之外的内存区域叫做“堆外内存”,Java中对堆外内存的操作,依赖于Unsafe提供的操作堆外内存的native方法啦。正如它的名字一样,这种操作底层的方式是不安全的,在程序中过度和不合理的使用,会带来未知的风险,因此,Unsafe虽然,但要慎用哦!终于,重点来了,我们写这篇文章的初衷是什么?
2024-05-31 17:30:29
643
原创 Java面试必考题之线程的生命周期,结合源码,透彻讲解!
当CPU效率稍低时,就会呈现上述结果,thread1启动后进入RUNNABLE状态,并且获得了同步方法,这是thread2启动后,调用的同步方法锁已经被占用,它作为等待的线程会从 RUNNABLE 转变到 BLOCKED 状态,待到thread1同步方法执行完毕,释放synchronized锁后,thread2获得锁,从BLOCKED转为RUNNABLE状态。所谓线程的生命周期,就是从它诞生到消亡的整个过程,而不同的编程语言,对线程生命周期的封装是不同的,在Java中线程整个生命周期被分为了。
2024-05-30 17:50:08
624
原创 Redis分布式锁的正确使用姿势
分布式锁在日常开发中,用处非常的多。包括但不限于抢红包,秒杀,支付下单,幂等,等等场景。分布式锁的实现方式有多种,包括redis实现,mysql实现,zookeeper实现等等。而其中redis非常适合作为分布式锁使用,并且在各个公司都大规模的使用。本文将由浅入深的探究Redis分布式锁的实现,最终实现一个可工业使用的Redis分布式锁。欢迎大家一步一步跟读,一起学习一起进步。分布式锁其实就是,控制分布式系统不同进程共同访问共享资源的一种锁的实现。
2024-05-23 17:27:38
1580
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅