Java基础
从入门到放弃
Sicimike
桃花影落飞神剑,碧海潮生按玉萧。
展开
-
如何获取子线程的执行结果
前言博主以前面试的时候,真真切切的被问过这样一道题:如何获取子线程的执行结果?总所周知,在单线程情况下,想获取线程执行结果很简单,只需要写类似的代码即可:Object result = xxx.getXxx();但是在多线程的情况下,想要获取子线程的执行结果,恐怕就没这么简单了。剑走偏锋我们都知道开启一个新线程的方式有两种:继承Thread类、实现Runnable接口。可是这两...原创 2020-01-08 21:59:40 · 5432 阅读 · 2 评论 -
Thread类、Runnable接口详解
前言Thread类想必都不陌生,第一次学习多线程的时候就一定会接触Thread类。本篇主要从Thread类的定义、使用、注意事项、源码等方面入手,全方位的讲解Thread类。Thread我们经常会被问到这样一个问题:Java开启一个新线程有哪几种方法?答案是两种:继承Thread类、实现Runnable接口。说只有两种,有人可能就不服了,实现Callable接口为什么不算?线程池为...原创 2019-12-26 23:08:02 · 6009 阅读 · 0 评论 -
深度解析延迟队列DelayQueue
前言有时候,我们有一些任务需要“稍后”来做,比如一些连接需要空闲一段时间后再关闭,session需要空闲一段时间后自动退出。这个时候就需要一些可以延迟执行任务的工具。DelayQueue(延迟队列)就是一个可以实现类似功能的工具。DelayQueueDelayQueue(延迟队列)的标准实现出现在JDK1.5中的J.U.C包中,作为一个工具类,用来管理一些需要延迟处理的任务。先来看下它的类体...原创 2019-12-23 22:41:41 · 2753 阅读 · 0 评论 -
深度解析优先级队列PriorityQueue
前言从学习队列(Queue)的第一天起,我们就知道队列是满足FIFO(后进先出)的。但是所有的队列都是这样吗?显然不是,今天所讲解的优先级队列PriorityQueue就不满足FIFO。优先级队列优先队列是计算机科学中的一类抽象数据类型。优先队列中的每个元素都有各自的优先级,优先级最高的元素最先得到服务;优先级相同的元素按照其在优先队列中的顺序得到服务。优先队列往往用堆来实现。前一篇...原创 2019-12-16 22:57:42 · 2857 阅读 · 2 评论 -
图解数据结构:堆
前言此处所说的堆,是数据结构中的堆,而不是JVM运行时数据区域的那个堆。本篇主要讲解数据结构中堆的实现,效率,使用等。定义堆(英语:Heap)是计算机科学中的一种特别的树状数据结构。若是满足以下特性,即可称为堆:“给定堆中任意节点P和C,若P是C的母节点,那么P的值会小于等于(或大于等于)C的值”。若母节点的值恒小于等于子节点的值,此堆称为最小堆(min heap);反之,若母节点的值恒大...原创 2019-12-12 21:59:32 · 4033 阅读 · 0 评论 -
面试官:请手写一段必然死锁的代码
前言死锁(Deadlock),是并发编程中最需要考虑的问题之一,一般来说死锁发生的概率相对较小,但是危害奇大。本篇主要讲解死锁相关的内容,包括死锁形成的必要条件、危害、如何避免等等。死锁的定义死锁(英语:Deadlock),又译为死结,计算机科学名词。当两个以上的运算单元,双方都在等待对方停止运行,以获取系统资源,但是没有一方提前退出时,就称为死锁。在多任务操作系统中,操作系统为了协调不同...原创 2019-12-03 21:46:41 · 2294 阅读 · 0 评论 -
HashMap多线程扩容导致死循环解析(JDK1.7)
不会再有比这篇更易懂的HashMap扩容死循环了原创 2019-11-28 22:07:20 · 4501 阅读 · 2 评论 -
HashMap底层结构与实现原理
前言HashMap可以说是我们用过最多的<K,V>键值对集合了。既然用得多,就得深入的了解它。基于此,本篇主要从源码层面讲解HashMap,包括成员变量(常量)、扩容时机、扩容过程、核心方法、JDK1.7的缺陷、JDK1.8对HashMap的改进等等JDK1.7下的HashMap成员变量/** * 默认初始容量,必须为2的指数幂 */static final int D...原创 2019-11-27 21:49:31 · 2490 阅读 · 0 评论 -
三种方式实现生产者-消费者模型
前言生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该...原创 2019-11-17 11:41:28 · 4214 阅读 · 0 评论 -
suspend/resume、wait/notify、park/unpark
如何阻塞线程、如何唤醒线程原创 2019-10-06 17:12:47 · 2551 阅读 · 2 评论 -
ReentrantLock功能详解
前言Java里的锁主要分为两种:Synchronized关键字和java.util.concurrent.locks.Lock接口的实现类。之前也写过几篇关于Synchronized的博客:synchronized关键字(一):实现原理。所以本篇主要讲解ReentrantLock功能使用、与Synchronized关键字的区别等等ReentrantLock废话不多说,先来看看Reentran...原创 2019-10-04 17:57:26 · 3266 阅读 · 1 评论 -
并发工具三巨头CountDownLatch、CyclicBarrier、Semaphore使用
前言JDK1.5提供了java.util.concurrent包(J.U.C)来简化并发编程,降低程序员使用并发编程的难度。JUC包中提供了几个并发控制工具,其中就有三巨头CountDownLatch、CyclicBarrier、Semaphore。本篇主要讲解三个工具的使用,其实现原理AbstractQueuedSynchronizer之后再详细讲解。CountDownLatchCount...原创 2019-10-03 17:00:27 · 2255 阅读 · 0 评论 -
无锁编程CAS
前言CAS(Compare And Swap,比较并交换),要说CAS是无锁编程,多多少少有些“标题党”的感觉。因为CAS根据其设计思想,可以划分为乐观锁。不同于synchronized关键字,synchronized实现的是悲观锁。我第一次听说乐观锁和悲观锁的时候有点震惊:一把锁我还得知道它乐不乐观?乐不乐观?一把锁难道还有情绪?实际上乐观锁和悲观锁是基于线程并发竞争的角度来说的,悲观锁就是...原创 2019-10-02 12:13:23 · 2532 阅读 · 0 评论 -
synchronized关键字(二):案例分析
线程八锁,了解一下。原创 2019-09-29 22:54:21 · 1915 阅读 · 0 评论 -
synchronized关键字(一):实现原理
前言对我而言,一提到多线程并发,第一个想到的就是synchronized关键字。因为synchronized基本上就是我学习Java多线程并发时接触到的第一个关键字,也是一把神兵利器。让我们很容易的就能写出线程安全的代码,正因为用法非常简单、功能非常强大,所以基本上是初学者接触到的第一个多线程并发关键字。作用对于synchronized关键字的作用,简单来说一句话就可以概况:在同一时刻,...原创 2019-09-29 21:02:32 · 2473 阅读 · 0 评论 -
Java虚拟机:内存区域
前言JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),...原创 2019-07-04 21:38:18 · 1933 阅读 · 0 评论 -
Java虚拟机:GC
关于JVM垃圾收集器的一切原创 2019-07-25 23:12:13 · 2011 阅读 · 0 评论 -
读取指定目录下的所有文件
/** * 调用:readFileTree("D:\\directory"); * @param rootPath * @throws IOException */ public static void readFileTree(String rootPath) throws IOException { File rootFi...原创 2019-08-05 21:01:04 · 2873 阅读 · 0 评论 -
Java虚拟机:类加载机制
前言虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。类加载类从被虚拟机加载到内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、...原创 2019-08-08 22:27:24 · 1954 阅读 · 0 评论 -
类初始化顺序
前言Class类中有静态属性、代码块、非静态属性…等诸多元素时,如果不清楚各个元素的初始顺序,那么很有可能会写出一些匪夷所思的代码。正因为其如此重要,所以博主写了个例子,很容易就能知道他们的初始顺序初始化顺序话不多说,直接上代码:class Display { public static int parentStaticField() { System.out.pr...原创 2019-08-06 21:11:32 · 2057 阅读 · 0 评论 -
Java虚拟机:类加载器
前言上一篇 Java虚拟机——类加载机制 说到整个类加载过程中除了加载(加载是类加载的一个阶段)阶段,用户可以自定义类加载器参与之外,其余的阶段均完全由虚拟机主导和控制,实际上已经明确了类加载器工作的阶段和主要作用。把“根据类的全限定名获取定义这个类的二进制字节流”这个动作放到虚拟机外部实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块被称为“类加载器”。对于任意一个类...原创 2019-08-10 12:54:48 · 1918 阅读 · 0 评论 -
Java线程到底有几种状态
前言很多文章说Java线程有五种状态:NEW(新建)、RUNNABLE(就绪)、RUNNING(运行)、BLOCKED(阻塞)、DEAD(死亡),而阻塞又分为等待阻塞、同步阻塞、其它阻塞。很遗憾这种说法是错误的,这五种状态确实早期的进程状态,也就是单线程进程的状态。线程状态Java线程到底有几种状态,其实只要打开一下JDK源码,看一下java.lang.Thread类就知道了,java.l...原创 2019-08-19 23:14:06 · 5866 阅读 · 0 评论 -
如何优雅的中断线程
前言有时候我们需要中断一个线程。由于启动一个线程的方法是start(),所以终止一个线程很容易想到stop(),JDK在java.lang.Thread类中确实提供了一个stop()方法,这个方法的作用是强制停止一个线程。但是从jdk1.2开始就被标记@Deprecated废弃了,因为强制停止一个线程不管该线程是否执行完成,并且会释放该线程持有的锁,因此会产生安全问题。...原创 2019-08-22 22:15:18 · 2376 阅读 · 0 评论 -
如何交替打印奇数偶数
线程间通信,了解一下。原创 2019-08-26 23:55:07 · 3442 阅读 · 0 评论 -
Java中四种引用
前言在JDK1.2之前,对象的引用状态只有:引用和未引用。从JDK1.2开始,引用状态分成了四种,从而更细粒度的控制对象的生命周期。四种引用由强到弱分别是:强引用、软引用、弱引用、虚引用。引用强引用(Strong Reference)强引用简单点说就是平时使用最多的以一种引用,一般是使用new关键字实例化的引用:Object object = new Object()强引用的特点是:虚...原创 2019-08-28 23:47:49 · 2022 阅读 · 0 评论 -
ThreadLocal花十分钟就能搞定
面试必问的ThreadLocal,了解一下。原创 2019-09-02 23:01:22 · 2623 阅读 · 0 评论 -
ThreadPoolExecutor线程池实现原理与源码解析
ThreadPoolExecutor线程池原理 + 源码,了解一下。原创 2020-01-10 22:44:18 · 3015 阅读 · 0 评论 -
看完这篇volatile,面试官再也不敢问你了
关于volatile的一切,了解一下。原创 2019-09-25 22:52:24 · 2185 阅读 · 0 评论 -
字符串一样,但是equals为false?
前言有时候写代码会遇到一些莫名其妙的问题,两个字符串明明toString()打印一模一样,但是equals就是为false。问题直接看代码public static void main(String[] args) { String s1 = "helloworld"; String s2 = "helloworld"; System.out.println(s1....原创 2019-06-17 23:43:31 · 22036 阅读 · 37 评论