1.1k 字 1 分钟

# 学习计划 Java # 消息队列 - # 数据库 - # Linux 操作系统 - # 软件工程概论 - #...
532 字 1 分钟

# 什么是守护线程 在 Java 中有两类线程:User Thread (用户线程)、Daemon Thread (守护线程) 任何一个守护线程都是整个 JVM 中所有非守护线程的保姆: 只要当前 JVM 实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着 JVM 一同结束工作。Daemon 的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是 GC (垃圾回收器),它就是一个很称职的守护者。 User 和 Daemon 两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果 User Thread 已经全部退出运行了,只剩下...
394 字 1 分钟

# 为什么要使用线程池 Java 线程的创建非常昂贵,需要 JVM 和 OS(操作系统)配合完成大量的工作: (1)必须为线程堆栈分配和初始化大量内存块,其中包含至少 1MB 的栈内存。 (2)需要进行系统调用,以便在 OS(操作系统)中创建和注册本地线程。 Java 高并发应用频繁创建和销毁线程的操作是非常低效的,而且是不被编程规范所允许的。如何降低 Java...
2.6k 字 2 分钟

# 线程池线程复用的原理是什么 思考这么一个问题:任务结束后会不会回收线程? 答案是:allowCoreThreadTimeOut 控制 /java/util/concurrent/ThreadPoolExecutor.java:1127final void runWorker(Worker w) { Thread wt = Thread.currentThread(); Runnable task = w.firstTask; w.firstTask = null; w.unlock(); // allow interrupts boolean...
3.5k 字 3 分钟

# 线程的 sleep、wait、join、yield 如何使用 sleep: sleep 的作用是让目前正在执行的线程休眠,让 CPU 去执行其他的任务。从线程状态来说,就是从执行状态变成限时阻塞状态。Sleep () 方法定义在 Thread 类中,是一组静态方法,有两个重载版本: // 使目前正在执行的线程休眠 millis 毫秒 public static void sleep(long millis) throws InterruptException; // 使目前正在执行的线程休眠 millis 毫秒,nanos 纳秒 public static void sleep(long...
558 字 1 分钟

# 如何预防死锁 首先举个例子说明什么是死锁,比如,一个十字路口,东西南北四个方向分别有四列车 ABCD,A 在东向被 D 堵着,D 北被 B 堵着,B 在西被 C 堵着,C 在南被 A 堵着,这就造成了十字路口的堵死,也就是所谓的死锁。 具体图示如下: 那么如何预防死锁? 死锁发生的四个必要条件: 互斥条件 同一时间只能有一个线程获取资源。 不可剥夺条件 一个线程已经占有的资源,在释放之前不会被其它线程抢占 请求和保持条件 线程等待过程中不会释放已占有的资源 循环等待条件...
1.3k 字 1 分钟

# Class 初始化过程是什么 # 类加载的过程 我们可以先简单说下类加载的过程,大致分为: ** 加载、验证、准备、解析、初始化 ** 几个阶段,使用和卸载都是已经加载完成之后,属于类的生命周期的两个阶段 # 类的初始化过程 下面我们就重点分析类的初始化的过程: 类的初始化阶段,是真正开始执行类中定义的 java 程序代码 (字节码) 并按程序员的意图去初始化类变量的过程。更直接地说,初始化阶段就是执行类构造器 < clinit>() 方法的过程。 <clinit>() 方法是由编译器自动收集类中的所有类变量的赋值动作和静态代码块...
729 字 1 分钟

# ConcurrentHashMap 底层原理是什么 1.7 数据结构: 内部主要是一个 Segment 数组,而数组的每一项又是一个 HashEntry 数组,元素都存在 HashEntry 数组里。因为每次锁定的是 Segment 对象,也就是整个 HashEntry 数组,所以又叫分段锁。 1.8 数据结构: 与 HashMap 一样采用:数组 + 链表 + 红黑树 底层原理则是采用锁链表或者红黑树头结点,相比于 HashTable...
546 字 1 分钟

# GC 如何判断对象可以被回收 # 引用计数法(已被淘汰的算法) 每一个对象有一个引用属性,新增一个引用时加一,引用释放时减一,计数为 0 的时候可以回收。但是这种计算方法,有一个致命的问题,无法解决循环引用的问题 # 可达性分析算法(根引用) 从 GcRoot 开始向下搜索,搜索所走过的路径被称为引用链,当一个对象到 GcRoot 没有任何引用链相连时,则证明此对象是不可用的,那么虚拟机就可以判定回收。 那么 GcRoot 有哪些? 虚拟机栈中引用的对象 方法区中静态属性引用的对象 方法区中常量引用的对象 本地方法栈中(即一般说的 native 方法)引用的对象 #...
1.2k 字 1 分钟

# JVM 8 为什么要增加元空间? # 持久代 持久代中包含了虚拟机中所有可通过反射获取到的数据,比如 Class 和 Method 对象。不同的 Java 虚拟机之间可能会进行类共享,因此持久代又分为只读区和读写区。 JVM 用于描述应用程序中用到的类和方法的元数据也存储在持久代中。JVM 运行时会用到多少持久代的空间取决于应用程序用到了多少类。除此之外,Java SE 库中的类和方法也都存储在这里。 如果 JVM 发现有的类已经不再需要了,它会去回收(卸载)这些类,将它们的空间释放出来给其它类使用。Full GC 会进行持久代的回收。 JVM 中类的元数据在 Java...