java
文章平均质量分 82
cherishfh
这个作者很懒,什么都没留下…
展开
-
Map面试题
首先,JDK8中是支持多线程扩容的,JDK8中的ConcurrentHashMap不再是分段,或者可以理解为每个桶为一段,在需要扩容时,首先会生成一个双倍大小的数组,生成完数组后,线程就会开始转移元素,在扩容的过程中,如果有其他线程在put,那么这个put线程会帮助去进行元素的转移,虽然叫转移,但是其实是基于原数组上的Node信息去生成一个新的Node的,也就是原数组上的Node不会消失,因为在扩容的过程中,如果有其他线程在get也是可以的。JDK8的HashMap是数组+链表+红黑树实现的。原创 2022-11-29 11:41:48 · 61 阅读 · 0 评论 -
线程池定义
参数含义核心线程大小,当提交一个任务到线程池时,线程池会创建一个线程来执行任务,即使有其他空闲线程可以处理任务也会创新线程,等到工作的线程数大于核心线程数时就不会再创建了。如果调用了线程池的prestartAllCoreThreads方法,线程池会提前把核心线程都创造好,并启动线程池允许创建的最大线程数。如果队列满了,且已创建的线程数小于最大线程数,则线程池会再创建新的线程执行任务。如果我们使用了无界队列,那么所有的任务会加入队列,这个参数就没有什么效果了线程池的工作线程空闲后,保持存活的时间。原创 2022-11-19 15:51:21 · 125 阅读 · 0 评论 -
ReentrantLock
Exclusive-独占,只有一个线程能执行,如ReentrantLockShare-共享,多个线程可以同时执行,如Semaphore/CountDownLatch同步等待队列:用于维护获取锁失败时入队的线程条件等待队列:调用await()方法回释放锁,然后线程会加入条件等待队列队尾,调用singal()唤醒的时候会把条件队列的线程节点移动到同步队列队尾,然后等待unlock解锁unpark同步等待队列的线程值为0,初始状态,表示当前节点在同步等待队列中,等待获取锁。原创 2022-11-13 10:32:59 · 144 阅读 · 0 评论 -
Java线程
进程就是用来加载指令、管理内存、管理 IO 的。原创 2022-11-12 20:26:16 · 125 阅读 · 0 评论 -
CAS&Atomic
基本类型引用类型:AtomicReference、AtomicStampedRerence(stamp是版本,每次修改可以通过+1保证版本唯一性,防止ABA问题)、AtomicMarkableReference(变量mark是boolean类型,仅记录值是否有过修改,防止ABA问题);数组类型对象属性原子修改器原子类型累加器(jdk1.8增加的类)原创 2022-11-02 20:09:08 · 79 阅读 · 0 评论 -
volatile
Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM),用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果,JMM规范了Java虚拟机与计算机内存是如何协同工作的:规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。JMM描述的是一种抽象的概念,一组规则,通过这组规则控制程序中各个变量在共享数据区域和私有数据区域的访问方式,JMM是围绕原子性、有序性、可见性展开的。原创 2022-10-31 00:24:34 · 133 阅读 · 0 评论 -
JVM常量池
Class常量池可以理解为是Class文件中的资源仓库。Class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池(constant pool table),用于存放编译期生成的各种字面量(Literal)和符号引用(Symbolic References)。原创 2022-10-19 22:40:34 · 325 阅读 · 2 评论 -
jvm类加载以及内存模型
jvm类加载以及内存模型总结原创 2022-10-03 19:28:40 · 130 阅读 · 0 评论 -
map在list循环里面赋值问题
查询回一个List<Map<String,Object>>集合,for循环里面遍历这个集合给新的list复制判断到特定的条件给这个list添加map结果,List集合中的所有当前map都被处理了,各种new对象,都未解决;问题原因是:指向问题:修改对象指向的是一个对象地址解决办法:循环list时,将对象每次都克隆一次,putAll();List<Map...原创 2019-01-24 15:25:43 · 5803 阅读 · 0 评论