![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
讨厌所有昵称是海洋精灵的
找工作ing
展开
-
Java系列-线程-为什么不能使用Executors创建线程池
为什么不能使用Executors创建线程池原创 2024-01-11 16:52:24 · 404 阅读 · 0 评论 -
Java系列-线程-线程池的创建方法和方法的参数
ThreadPoolExecutor原创 2024-01-10 15:12:06 · 470 阅读 · 0 评论 -
Java系列-Class.forName和ClassLoader.loadClass的区别
和是 Java 中两种加载类的方式,它们的主要区别在于加载类的时机和对异常的处理。原创 2024-01-08 15:25:05 · 562 阅读 · 0 评论 -
Java系列-HTTP和HTTPS 的实现原理
HTTP(Hypertext Transfer Protocol)和HTTPS(Hypertext Transfer Protocol Secure)是用于在网络上传输数据的两种协议,它们在实现原理和安全性上有一些关键的区别。原创 2023-12-28 18:17:28 · 812 阅读 · 0 评论 -
java系列-CountDownLatch
并没有像锁一样控制对临界区的访问,而是提供了一种不同的线程协作机制。它通常用于一组线程需要等待另一组线程完成操作的场景。方法会阻塞当前线程,直到计数器的值减到零。这个类主要用于一个或多个线程等待其他线程完成某些操作后再继续执行。不是一种锁,而是一种同步工具类,用于协调多个线程之间的操作。关键字那样实现了锁定机制,而是通过一个计数器来实现线程的等待和通知。维护了一个计数器,这个计数器的初始值由调用者在创建。方法,计数器的值减一;原创 2023-12-28 18:02:50 · 560 阅读 · 0 评论 -
java系列-Semaphore
信号量(Semaphore)不是严格意义上的锁,而是一种同步工具,用于控制同时访问某个特定资源的线程数量。信号量是由计数器和等待队列组成,它维护一个可用的许可证数量,线程可以通过获取许可证来执行临界区代码,执行完成后再释放许可证。二进制信号量只有两个状态,0 和 1。也称为互斥锁(Mutex),可以用于实现对临界区的互斥访问。类提供了对信号量的支持。原创 2023-12-28 18:00:28 · 359 阅读 · 0 评论 -
java系列-锁分为哪几类
在 Java 多线程编程中,锁机制是一种重要的同步工具,用于协调线程之间的访问和操作。原创 2023-12-28 17:55:31 · 458 阅读 · 0 评论 -
JVM系列-方法区、堆区、栈区
在 Java 中,内存主要分为方法区、堆区和栈区,每个区域负责不同类型的数据和任务。原创 2023-12-28 13:45:00 · 666 阅读 · 0 评论 -
Java系列-ConcurrentHashMap获取size
baseCount和数组counterCells的每个元素的value之和。原创 2023-12-17 00:08:26 · 57 阅读 · 0 评论 -
Java系列-ConcurrentHashMap-addCount
如果有冲突,数组容量没有超过cpu核数,对数组进行扩容,新容量为老容量的2倍;初始化 counterCells,初始容量是2,将x放到要放入的位置;如果重新生成hash后,还是有冲突,将x增加到该桶的value;如果要放入的桶有冲突,重新生成hash,再看有没有冲突;如果没有冲突,放入该桶;原创 2023-12-17 00:03:13 · 70 阅读 · 0 评论 -
Java系列-ConcurrentHashMap源码-putVal
处理某个槽位时使用synchronized。cas+自旋保证线程安全。原创 2023-12-16 15:56:38 · 57 阅读 · 0 评论 -
Java系列-ConcurrentHashMap源码
二进制的最高位是符号位,HASH_BITS的最高位是0,所以&运算结果的最高位一定是0;&运算的目的是为了保证hash值一定是正数,因为hash值为负数有特殊含义;初始完后sizeCtl被赋值为0.75*n (扩容阈值)为什么比HashMap多 & HASH_BITS。原创 2023-12-16 15:14:14 · 43 阅读 · 0 评论 -
Java系列-ConcurrentHashMap构造方法
【代码】Java系列-ConcurrentHashMap构造方法。原创 2023-12-16 13:03:54 · 51 阅读 · 0 评论 -
Java系列-HashMap构造方法
将initialCapacity经过计算,换成大于等于initialCapacity的最小2的幂次方,然后赋值给threshold;在put的时候,threshold会被赋值给table的length,按照threshold来创建table。如果一开始cap是2的幂次方,如果不-1,最后的返回结果会是cap*2。只初始化了loadFactor。原创 2023-12-16 00:16:25 · 69 阅读 · 0 评论 -
Java系列-HashSet源码
实际调用的是HashMap的put方法,添加的值作为key。实际调用的是HashMap的containsKey方法。实际调用的是HashMap的remove方法。原创 2023-12-15 16:10:39 · 46 阅读 · 0 评论 -
Java系列-线程-构建线程的几种方式
创建线程的几种方式原创 2023-12-14 22:14:54 · 386 阅读 · 0 评论 -
java系列-LinkedHashMap怎么实现LRU
2.最近访问的节点移动到链表末尾 3.LruCache3.1.LruCache.put3.2.LruCache.evict3.3.LruCache.trimToSize循环移除,直到size小于maxSize,每次移除链表头元素3.4.LinkedHashIterator.remove原创 2023-12-13 13:00:13 · 181 阅读 · 0 评论 -
java系列-LinkedHashMap遍历
获取全局变量entrySet,如果为null,创建LinkedEntrySet。创建LinkedEntryIterator。原创 2023-12-12 23:54:19 · 404 阅读 · 0 评论 -
java系列-HashMap遍历
获取全局变量entrySet,如果为null,新建一个EntrySet。创建EntryIterator,构造方法里会给next赋值。将这次要返回的节点赋值给e;判断next是否为null。原创 2023-12-12 23:30:30 · 44 阅读 · 0 评论 -
java系列-LinkedHashMap
【代码】java系列-LinkedHashMap。原创 2023-12-12 19:01:14 · 43 阅读 · 0 评论 -
java系列-4种引用
当JVM检测到没有强引用指向一个对象时,就会进行垃圾回收,并释放该对象的内存。虚引用是最弱的一种引用类型。虚引用的存在不会对对象的生存时间产生影响,也无法通过虚引用访问对象的数据。通过虚引用和引用队列,开发者可以在对象被回收时进行一些清理或通知的操作。虚引用并不会影响对象的生命周期,因为在任何时候都可能被垃圾回收器回收,且虚引用的。当JVM进行垃圾回收时,不管内存是否足够,都会回收被弱引用指向的对象。虚引用的存在主要是为了提供一种机制,使得在对象被回收时可以进行一些额外的操作,而不是直接操作对象本身。原创 2023-12-12 14:58:55 · 32 阅读 · 0 评论 -
ThreadLocal系列-ThreadLocal源码
存储在线程的一个变量里,类型为ThreadLocalMapThreadLocalMap存储的是Entrykey是ThreadLocal。原创 2023-12-11 18:48:26 · 32 阅读 · 0 评论 -
ThreadLocal系列-ThreadLocalMap源码
如果table[i]不为stale元素,计算table[i]中的Entry本来应该放入的index,从那个index开始往后找Entry应该放入的位置A,将该Entry放入位置A;key不为null,根据新table的length计算index,将该元素放入合适的位置;计算index,在table[index]处放入new Entry(key, value);如果table[i]为stale元素,从table清除该元素;(2)从staleSlot往后遍历table,直到table[i]为null。原创 2023-12-11 22:45:20 · 53 阅读 · 0 评论 -
HashMap系列-resize
计算在新table的位置e.hash & (newCap - 1),这个跟e.hash & oldCap执行速度一样,为啥不直接用e.hash & (newCap - 1)计算?在挪动老的数据到新table的时候,为啥要这样计算呢?这样计算并没有剩什么时间吧。原创 2023-12-07 12:14:50 · 50 阅读 · 0 评论 -
HashMap系列-放入元素的流程
【代码】HashMap系列-放入元素的流程。原创 2023-12-06 22:01:21 · 67 阅读 · 0 评论 -
HashMap系列- key到i的转换
数组长度是2的n次幂,这样hash & (length-1) = hash%length,&比%具有更高的效率;当我们根据key的hash确定其在数组的位置时,如果n为2的幂次方,可以保证数据的均匀插入,如果n不是2的幂次方,可能数组的一些位置永远不会插入数据,浪费数组的空间,加大hash冲突。求key的hash的时候,前16位和后16位低16 bit和高16 bit做了一个异或,这样可以尽量减少hash冲突。原创 2023-12-06 14:05:22 · 70 阅读 · 1 评论 -
HashMap系列-什么情况下扩容
添加完元素,size+1,然后判断size是不是大于threshold,如果大于的话,就执行resize。一开始table为null,第一次调用put方法放入元素的时候,会调用resize来初始化table。原创 2023-12-06 15:20:21 · 100 阅读 · 0 评论 -
HashMap系列-怎么保证table的length是2的n次幂
会根据初始容量参数计算出threshold,在resize的时候,会将这个threshold赋值给数组容量。只初始化了loadFactor。原创 2023-12-06 14:55:18 · 67 阅读 · 1 评论 -
Java系列-LinkedList源码
遍历找到元素后,移动该元素。更新老last的next。先通过遍历的方式获得元素。然后将该元素从列表移除。原创 2023-12-01 15:28:46 · 218 阅读 · 1 评论 -
Java系列-ArrayList源码
ArrayList源码原创 2023-12-01 13:56:25 · 64 阅读 · 1 评论 -
Java系列-new Object的过程
从《深入理解Java虚拟机》里面的第七章看到了一些,先简单记录一下,好多不懂的。类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载7个阶段。其中验证、准备、解析3个部分统称为连接。上图中,加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始,而解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定)。原创 2023-11-30 01:56:52 · 109 阅读 · 0 评论