Author: 詹学伟

说说synchronized与ReentrantLock的区别

用法不同:synchronized 可以用于修饰普通方法、静态方法以及代码块,而 ReentrantLock 仅适用于代码块。 获取锁和释放锁方式不同:Synchronized 是隐式锁,可以自动加锁和释放锁,当进入 synchronized 修饰的代码块之后会自动加锁,当离开 synchroniz

詹学伟 Published on 2024-04-27

如何避免死锁

死锁是多线程编程中的一种常见问题,它发生在两个或多个线程相互等待对方释放资源的情况下,导致程序无法继续执行。为了避免死锁,我们可以采用以下策略: 锁顺序: 定义一个固定的锁获取顺序,并要求所有线程都按照相同的顺序获取锁。这可以减少不同线程之间资源争夺的可能性。 超时机制:

詹学伟 Published on 2024-04-27

Java线程之间是如何通信的

当我们处理线程通信时,通常有两种主要的实现方式,每种方式都有其独特的机制和优势: 共享内存: 这是一种常见的方式,多个线程可以访问同一个共享内存区域,通过读取和写入共享内存中的数据来进行通信和同步。在Java中,我们可以使用共享变量或共享数据结构来实现共享内存通信。例如,可以使用 volatile

詹学伟 Published on 2024-04-27

JAVA 中用到的线程调度算法是什么

在Java中,线程调度采用的是一种抢占式调度模型。这就像在一个抢夺战中,有较高优先级的线程将首先占用CPU资源。如果线程具有相同的优先级,那么Java虚拟机会随机选择一个线程来执行,以保持公平竞争的原则。一旦一个线程获得了CPU,它将一直运行,直到自愿放弃CPU资源,或者由于某些情况(比如等待I/O

詹学伟 Published on 2024-04-27

死锁与活锁,死锁与饥饿的区别

死锁是指多个线程相互等待对方释放资源,导致它们都无法继续执行下去。这是一种静止状态,这种情况会导致所有线程都被永久性地阻塞,没有一个线程能够继续执行。就像交通堵塞一样,没有车辆能够前进。 活锁是指多个线程不断地改变自己的状态以回应对方,但最终无法取得进展,导致线程不断重试相同的操作,却无法成功。这是

詹学伟 Published on 2024-04-27

JAVA守护线程和本地线程的区别

守护线程,可以看作是为其他线程提供服务的辅助工具。它们通常执行一些后台任务,比如垃圾回收、定期检查、日志记录等。一个重要的特点是它们不会阻止JVM的退出。当所有的本地线程都执行完毕后,JVM会自动退出,不会等待守护线程。 本地线程,则是应用程序的主力军,执行着应用的核心逻辑。它们的存在会阻止JVM退

詹学伟 Published on 2024-04-27

进程和线程的区别

当一个程序在计算机上运行时,通常会创建至少一个进程。进程被认为是操作系统分配资源的最小单元,每个进程都拥有独立的内存空间和系统资源,包括文件句柄和网络连接等。操作系统通常使用进程来表示独立的应用程序实例。比如,你的计算机上可能同时运行着浏览器、文本编辑器、音乐播放器等多个进程。 每个进程至少包含一个

詹学伟 Published on 2024-04-27

启动线程为何调用start而不是run方法

调用 start() 方法会告诉jvm创建一个新的线程,并在这个新线程中执行与 run() 方法相关联的代码块。这个过程允许多个线程同时运行,每个线程都拥有独立的执行上下文,这意味着它们可以在不互相干扰的情况下执行任务。 与此不同,如果直接调用 run() 方法,它仅

詹学伟 Published on 2024-04-27

说说并发和并行的区别

并发针对单核 CPU 而言,它指的是 多个任务交替执行,每个任务都会在一段时间内执行一部分,然后切换到另一个任务,因为单核 CPU 一次只能执行一个任务。并发的目的是提高系统的响应性和吞吐量,允许多个任务在同一个处理器上共享时间片。 并行针对多核 CPU 而言,它指的是多个任务真正同时执行,每个任务

詹学伟 Published on 2024-04-27

什么是阻塞队列,举几个应用场景

阻塞队列(BlockingQueue)是一种特殊类型的队列,它用于在多线程环境中实现线程之间的通信。常见的Java阻塞队列实现包括:ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue等。 阻塞队列具有以下特点: 当队列为空时,从队

詹学伟 Published on 2024-04-27
Previous Next