Ryan's Blog

公平锁和非公平锁的区别?

公平锁和非公平锁的区别? 典型回答 非公平锁:多个线程不按照申请锁的顺序去获得锁,而是直接去尝试获取锁,获取不到,再进入队列等待,如果能获取到,就直接获取到锁。 公平锁:多个线程按照申请锁的顺序去获得锁,所有线程都在队列里排队,这样就保证了队列中的第一个先得到锁。 两种锁分别适合不同的场景中,存在着各自的优缺点,对于公平锁来说,他的优点是所有的线程都能得到资源,...

什么是线程池,如何实现的?

什么是线程池,如何实现的? 典型回答 线程池是池化技术的一种典型实现,所谓池化技术就是提前保存大量的资源,以备不时之需。在机器资源有限的情况下,使用池化技术可以大大的提高资源的利用率,提升性能等。 线程池,说的就是提前创建好一批线程,然后保存在线程池中,当有任务需要执行的时候,从线程池中选一个线程来执行任务。 在编程领域,比较典型的池化技术有: 线程池、连接池、内存池、对象池等。 ...

什么是死锁,如何解决?

什么是死锁,如何解决? 典型回答 死锁是指两个或两个以上的进程(或线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 比如:丈母娘要求先买房才能结婚,但是女婿说先结婚买房 扩展知识 产生死锁的四个必要条件 (1) 互斥条件:一个资源每次只能被一个进...

什么是总线嗅探和总线风暴,和jmm有什么关系?

什么是总线嗅探和总线风暴,和JMM有什么关系? 典型回答 在Java内存模型中,总线嗅探和总线风暴问题与CPU缓存一致性有关。 在多线程编程中,如果多个线程共享同一个变量,且变量存储在主存中,则每个线程都有可能在自己的缓存中缓存该变量。如果一个线程修改了该变量的值,那么其他线程可能无法立即看到这个修改,因为它们缓存的是旧值。 为了保证缓存一致性,CPU 会使用总线嗅探机制来检测是否有...

什么是并发,什么是并行?

什么是并发,什么是并行? 典型回答 并发(Concurrent),在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。 那么,操作系统是如何实现这种并发的呢? 现在我们用到操作系统,无论是Windows、Linux还是MacOS等其实都是多用户多任务分时操作系统。使用这些操作系统的用户是可以“同时”干多件事的。 但是实际上,...

什么是守护线程,和普通线程有什么区别?

什么是守护线程,和普通线程有什么区别? 典型回答 在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 。用户线程一般用于执行用户级任务,而守护线程也就是“后台线程”,一般用来执行后台任务,守护线程最典型的应用就是GC(垃圾回收器)。 这两种线程其实是没有什么区别的,唯一的区别就是Java虚拟机在所有都结束后就会退出,而不会等执行完。 扩...

什么是多线程中的上下文切换?

什么是多线程中的上下文切换? 典型回答 上下文切换是指 CPU 从一个线程转到另一个线程时,需要保存当前线程的上下文状态,恢复另一个线程的上下文状态,以便于下一次恢复执行该线程时能够正确地运行。 在多线程编程中,上下文切换是一种常见的操作,上下文切换通常是指在一个 CPU 上,由于多个线程共享 CPU 时间片,当一个线程的时间片用完后,需要切换到另一个线程运行。此时需要保存当前线程的状...

什么是可重入锁,怎么实现可重入锁?

什么是可重入锁,怎么实现可重入锁? 典型回答 可重入锁是一种多线程同步机制,允许同一线程多次获取同一个锁而不会导致死锁。这意味着一个线程可以在持有锁的情况下再次请求并获得相同的锁,而不会被自己阻塞。可重入锁有助于避免死锁和提高代码的可维护性,因为它允许在一个线程中嵌套地调用锁定的方法。 如我们常用的synchronized和reentrantLock都是比较典型的可重入锁。也就是说,在...