JAVA数据结构
文章平均质量分 86
程序员的日常分享
本公众号不定期分享java语言、Go语言、云原生、微服务等领域的技术知识。传播优秀接地气的文章,共同提高、成长,开启架构师之路
展开
-
程序员经典面试题--深入理解JVM系列(三)类加载机制
如果觉得写的还可以请关注微信公众号:程序猿的日常分享,定期更新分享。JVM在加载类时默认采用的是双亲委派机制。通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。关于虚拟机默认的双亲委派机制,我们可以从系统类加载器和标准扩展类加载器为例作简单分析。java自带类加载器类加载器负责加载所有的类,其为所有被载入内存中的类生成一个java.lang.Class实例原创 2021-03-24 08:29:19 · 253 阅读 · 0 评论 -
程序员经典面试题——java并发编程-线程池(二)ThreadPoolExecutor参数详解
如果觉得写的还可以请关注微信公众号:程序猿的日常分享,定期更新分享。上一篇介绍了Executor框架,说到了Executor框架的成员,那么它最核心的成员就是ThreadPoolExecutor,它是线程池的实现类。ThreadPoolExecutor主要参数ThreadPoolExecutor主要有6个参数,构造方法如下:public ThreadPoolExecutor(int corePoolSize, int maximu原创 2021-03-23 10:08:00 · 314 阅读 · 0 评论 -
java并发编程-线程的6种状态及转换
如果觉得写的还可以请关注微信公众号:程序猿的日常分享,定期更新分享。线程的6种状态就像生命一样,线程也有从出生到死亡的过程,这个过程就是线程的生命周期,在java中,线程的生命周期共有6种状态,分别是:初始(NEW):新创建了一个线程对象,但还没有调用start()方法。 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。 线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池原创 2021-01-07 09:58:19 · 129 阅读 · 0 评论 -
java并发编程-final关键字
final的作用1、final可以修饰类,方法和变量。2、final修饰的类,不能被继承,即它不能拥有自己的子类。3、final修饰的方法,不能被重写。4、final修饰的变量,无论是类属性、对象属性、形参还是局部变量,都需要进行初始化操作。 不变性如果对象在被创建之后,其状态就不能修改了,那么它就具备“不变性”。举个简单例子:public class User { //使用final修饰变量 final int age = 20; public sta原创 2021-01-07 19:05:17 · 129 阅读 · 0 评论 -
java并发编程-Lock
关注微信公众号:程序猿的日常分享,定期更新分享。在java1.5之后,并发包中增加了Lock接口用来实现锁的功能,他提供了与synchronized关键字类似的同步功能,只是在使用的时候需要显式的获取和释放锁。虽然它缺少了隐式获取释放锁的便捷性,但是却拥有了锁获取和锁释放的可操作性、可中断的获取锁以及超时获取锁等多种synchronized关键字不具备的功能。Lock是什么通过源码我们可以知道,Lock是一个接口,他总共有6个Api组成。代码如下:public interface Lock原创 2021-01-02 10:42:13 · 106 阅读 · 0 评论 -
java并发编程-synchronized
关注微信公众号:程序猿的日常分享,定期更新分享。在java中synchronized关键字是同步锁,他可以让我们的程序运行起来线程安全,屏蔽多线程带来的问题,实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。实现原理Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的互斥锁(Mutex Lock)来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高,状态.原创 2020-12-31 11:31:23 · 110 阅读 · 0 评论 -
数据结构之树型结构
关注V信公重号:程序猿的日常分享,定期更新分享。树的定义树是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:1、每个结点有零个或多个子结点;2、没有父结点的结点称为根结点;3、每一个非根结点有且只有一个父结点;4、除了根结点外,每个子结点可以分为多个不相交的子树;为什么需要树因为它结合了另外两种数据结构的优点: 一种是有序数组,另一种是链表。在树中查找数据项的速原创 2020-12-28 11:49:10 · 1848 阅读 · 0 评论 -
ConcurrentHashMap解析
上一篇我们从HashMap的数据结构及线程安全方面进行了一个了解,我们都知道HashMap是线程不安全的,所以在多线程环境下,为了线程安全我们有3种选择:ConcurrentHashMap、HashTable、Collections.SynchronizedMap(new HashMap()),后两种的实现原理类似,就是几乎每个方法都被 synchronized 关键字所修饰了,这也就保证了线程安全。由于每个方法都加上同步锁,导致性能下降,所以从性能考虑我们的最优选择是ConcurrentHashMap,那原创 2020-12-27 12:29:42 · 78 阅读 · 0 评论 -
HashMap解析
HashMap解析原创:程序猿的日常分享HashMap是我们日常工作中使用非常多的容器,由于HashMap是线程不安全的,那么在多咸亨环境下ConcurrentHashMap则是替代HashMap的容器,这两个也是Map的最主要的实现类之一。本文将通过数据结构、线程安全的角度出发去了解这两个重要的集合类的原理。一、数据结构HashMap 和 ConcurrentHashMap 都有这样一个特点:最开始的 Map 是空的,因为里面没有任何元素,往里放元素时会计算key的hash 值,计算之后,原创 2020-12-23 10:36:15 · 203 阅读 · 1 评论