![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java 基础
普通网友
这个作者很懒,什么都没留下…
展开
-
JDK 源码复习 concurrent 包 volatile
一、简介volatile是Java提供的一种轻量级的同步机制。Java语言包含两种内在的同步机制:同步块(或方法)和volatile变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。但是volatile变量的同步性较差(有时它更简单并且开销更低),而且其使用也更容易出错。二、并发编程...原创 2019-09-19 11:32:14 · 141 阅读 · 0 评论 -
JDK 源码复习 concurrent 包 01 线程池ThreadPoolExecutor
concurrent包类图如下,总共分为四大部分 线程池 ThreadPoolExecutor,Future,BlockingQueue,ConcurrentMap先看下ExecutorService接口作用:1. 执行任务Runnable(execute方法)2. 提交任务Runnable、Callable(submit方法)3. 一次提交多个任务(invoke方法)4. 关闭...原创 2019-09-17 18:30:57 · 109 阅读 · 1 评论 -
JDK 源码复习 util包 06 Map相关 HashMap02
转载https://blog.csdn.net/lch_2016/article/details/81045480①.判断键值对数组table[i]是否为空或为null,否则执行resize()进行扩容;②.根据键值key计算hash值得到插入的数组索引i,如果table[i]==null,直接新建节点添加,转向⑥,如果table[i]不为空,转向③;③.判断table[i...原创 2019-09-17 17:45:51 · 89 阅读 · 0 评论 -
JDK 源码复习 util包 05 Map相关 HashMap01
转载https://blog.csdn.net/lch_2016/article/details/81045480总结:接口java.util.Map,此接口主要有四个常用的实现类,分别是:HashMap:继承abstractMap,底层实现数组+链表+红黑树(JDK1.8增加了红黑树部分),线程不安全,kv结构,可以用 Collections的synchronizedMap方法使H...原创 2019-09-17 14:59:39 · 91 阅读 · 0 评论 -
JDK 源码复习 util包 04 HashTable && HashSet
HashTablehashtable的结构图说明:代码块1:为Entry节点中包含的key、value、hash、next。 代码块2:为Entry的构造函数,即把新节点接在了next链表的开头部分。Hasttable的默认容量(数组大小)为11,默认的负载因子为0.75。同时由代码块2可知数组扩容的阈值threshold=capacity*loadFact...原创 2019-09-17 12:50:15 · 117 阅读 · 0 评论 -
JDK 源码复习 util包 03 Queue相关
概述ArrayDeque是一个数组实现的双端队列,它不是线程安全的,并且不允许操作null值,把他当做栈使用时,要比Stack(Stack是线程安全的,使用synchronized修饰方法)更高效,当队列使用时,要比LinkedList(使用链表实现)更高效。结构在看ArrayDeque的源码前,先要了解循环数组。+++++++++++++++++++++++++...原创 2019-09-17 12:47:59 · 251 阅读 · 0 评论 -
JDK 源码复习 util包 02 Set相关
HashSet:和前面介绍的大多数集合一样,HashSet 也实现了 Cloneable 接口和 Serializable 接口,分别用来支持克隆以及支持序列化。还实现了 Set 接口,该接口定义了 Set 集合类型的一套规范。①:实现了Serializable接口,表明它支持序列化。②:实现了Cloneable接口,表明它支持克隆,可以调用超类的clone()方法进行浅拷贝。...原创 2019-09-17 12:14:26 · 98 阅读 · 0 评论 -
JDK 源码复习 util包 01 List相关
抽象类AbstractList实现List接口,具体为vector,SubList,ArrayList,LinkedList,Stack,RandomAccessSubList1、Vector 类几乎对每一个独立操作(除 Iterator 相关方法)都实现了同步,即在每个方法上几乎都增加了 synchronized 关键字来实现线程间的同步。可见 Vector 的扩容量是由 ol...原创 2019-09-17 10:11:44 · 118 阅读 · 0 评论 -
JDK 源码复习 concurrent 包 03 CyclicBarrier
CyclicBarrier 例子: /** * 实现功能是将goodsReqDtoList作为calcEstimateAmount方法的入参,然后将最终的结果放入map中进行返回 * 1.根据 goodsReqDtoList 的长度,判断我们要开多少个线程 * 2.将每个线程获得的结果放入 map 中,等到所有线程都计算完,将结果进行返回 ...原创 2019-09-19 10:29:11 · 120 阅读 · 0 评论 -
JDK 源码复习 LockSupport 分析
LockSupport 和 CAS 是Java并发包中很多并发工具控制机制的基础,它们底层其实都是依赖Unsafe实现。LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。LockSupport 提供park()和unpark()方法实现阻塞线程和解除线程阻塞,LockSupport和每个使用它的线程都与一个许可(permit)关联。permit相当于1,0的开关,默认是0,调用...原创 2019-09-18 09:55:03 · 106 阅读 · 0 评论 -
布隆过滤器实现 java
布隆过滤器的作用是加快判定一个元素是否在集合中出现的方法。因为其主要是过滤掉了大部分元素间的精确匹配,故称为过滤器。布隆过滤器在日常生活工作,我们会经常遇到这的场景,从一个Excel里面检索一个信息在不在Excel表中,还记得被CTRL+F支配的恐惧么,不扯了,软件开发中,一般会使用散列表来实现,Hash Table也叫哈希表,哈希表的优点是快速准确,缺点是浪费储存空间,我们这个场景,储存登录的userId到哈希表,当用户规模十分巨大的时候,哈希表的储存效率低的问题就显示出来了,今天介绍一种数学工具原创 2020-05-16 22:30:19 · 272 阅读 · 0 评论 -
Java 新垃圾回收器深入学习 ZGC 02
ZGC(Z Garbage Collector)是一款由Oracle公司研发的,以低延迟为首要目标的一款垃圾收集器。它是基于动态Region内存布局,(暂时)不设年龄分代,使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记-整理算法的收集器。在JDK 11新加入,还在实验阶段,主要特点是:回收TB级内存(最大4T),停顿时间不超过10ms。小型Region(Small Region)...原创 2020-04-12 23:09:00 · 204 阅读 · 0 评论 -
JVM 源码分析05
JVM源码分析之Java类的加载过程背景最近对Java细节的底层实现比较感兴趣,比如Java类文件是如何加载到虚拟机的,类对象和方法是以什么数据结构存在于虚拟机中?虚方法、实例方法和静态方法是如何调用的?本文基于openjdk-7的OpenJDK实现Java类在HotSpot的内部实现进行分析。HotSpot内存划分在HotSpot实现中,内存被划分成Java堆、方法区、Java栈...原创 2020-04-12 19:02:55 · 274 阅读 · 0 评论 -
JVM 源码分析04 synchronized
JVM源码分析之java对象头实现HotSpot虚拟机中,对象在内存中的布局分为三块区域:对象头、实例数据和对齐填充。对象头对象头包括两部分:Mark Word 和 类型指针。Mark WordMark Word用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,占用内存大小与虚拟机位长一致。类型...原创 2020-04-12 13:40:37 · 143 阅读 · 0 评论 -
JVM 源码分析03
深入分析Object.finalize方法的实现原理finalize如果类中重写了finalize方法,当该类对象被回收时,finalize方法有可能会被触发,下面通过一个例子说明finalize方法对垃圾回收有什么影响。FinalizerThread线程负责从ReferenceQueue队列中获取Finalizer对象,如果队列中没有元素,则通过wait方法将该线程挂...原创 2020-04-11 00:24:45 · 165 阅读 · 0 评论 -
Java 知识点复习01
JVM、JRE和JDK的关系JVMJava Virtual Machine是Java虚拟机,Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,因此Java语言可以实现跨平台。JREJava Runtime Environment包括Java虚拟机和Java程序所需的核心类库等。核心类库主要是java.lang包:包含了运行Java程序必不可少的系统类,如基本数据类型、基本数学函数...原创 2020-04-26 10:21:00 · 87 阅读 · 0 评论 -
Java 基础知识点 12
原创 2020-04-10 21:44:33 · 39 阅读 · 0 评论 -
Java 并发 知识点01
多线程的好处:可以提高 CPU 的利用率。在多线程程序中,一个线程必须等待的时候,CPU 可以运行其它的线程而不是等待,这样就大大提高了程序的效率。也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。多线程的劣势:线程也是程序,所以线程需要占用内存,线程越多占用内存也越多;多线程需要协调和管理,所以需要 CPU 时间跟踪线程;线程之间对共享资源的访问会相互影响,...原创 2020-04-16 19:27:35 · 49 阅读 · 0 评论 -
JDK 源码复习 concurrent 包 concurrentHashMap 01
https://baijiahao.baidu.com/s?id=1617089947709260129&wfr=spider&for=pchttps://www.cnblogs.com/zerotomax/p/8687425.htmlhttps://www.cnblogs.com/yangming1996/p/8031199.htmlhttps://www.cnblo...原创 2019-09-18 09:55:33 · 120 阅读 · 0 评论 -
JDK 源码复习 lock 包 AQS 分析01
Java 中的 FutureTask 作为可异步执行任务并可获取执行结果而被大家所熟知。通常可以使用 future.get() 来获取线程的执行结果,在线程执行结束之前,get 方法会一直阻塞状态,直到 call() 返回,其优点是使用线程异步执行任务的情况下还可以获取到线程的执行结果,但是 FutureTask 的以上功能却是依靠通过一个叫 AbstractQueuedSynchron...原创 2019-09-18 09:54:30 · 94 阅读 · 0 评论 -
JDK 源码复习 util包 06 Map相关 HashMap03
线程安全性在多线程使用场景中,应该尽量避免使用线程不安全的HashMap,而使用线程安全的ConcurrentHashMap。那么为什么说HashMap是线程不安全的,下面举例子说明在并发的多线程使用场景中使用HashMap可能造成死循环。代码例子如下(便于理解,仍然使用JDK1.7的环境):其中,map初始化为一个长度为2的数组,loadFactor=0.75,threshold=2...原创 2019-09-17 18:04:09 · 95 阅读 · 0 评论 -
Java unsafe 深入分析
Unsafe类是在sun.misc包下,不属于Java标准。但是很多Java的基础类库,包括一些被广泛使用的高性能开发库都是基于Unsafe类开发的,比如Netty、Cassandra、Hadoop、Kafka等。Unsafe类在提升Java运行效率,增强Java语言底层操作能力方面起了很大的作用。Unsafe类使Java拥有了像C语言的指针一样操作内存空间的能力,同时也带来了指针的问题...原创 2019-12-09 19:48:05 · 170 阅读 · 0 评论 -
JDK 源码复习 Semaphore
Semaphore称为计数信号量,它允许n个任务同时访问某个资源,可以将信号量看做是在向外分发使用资源的许可证,只有成功获取许可证,才能使用资源Sync类继承了AQS,并且实现了对许可permits的操作方法,总结如下非公平NonFailSync继承了Sync,表示抢占式,非公平获取资源。然后就是调用CAS,unsafe.compareAndSwapInt, ...原创 2019-12-07 20:02:39 · 107 阅读 · 0 评论 -
JDK 源码复习 lock 包AQS 分析03
转载自美团点评技术博客https://mp.weixin.qq.com/s/sA01gxC4EbgypCsQt5pVog 本文只涉及到独占锁,不涉及共享锁Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于AbstractQueuedSynchronizer(简称为AQS)实现的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型...原创 2019-12-07 09:23:27 · 187 阅读 · 0 评论 -
JDK 源码复习 lock 包AQS 分析02
前言经过本系列的上半部分JDK1.8 AbstractQueuedSynchronizer 的实现分析(上)的解读,相信很多读者已经对 AbstractQueuedSynchronizer(下文简称 AQS) 的独占功能了然于胸, 那么这次我们通过对另一个工具类:CountDownLatch 的分析来解读 AQS 的另外一个功能:共享功能。AQS 共享功能的实现在开始解读 AQS 的...原创 2019-09-18 09:54:49 · 100 阅读 · 0 评论 -
知识点复习0704 java基础07
java 为什么wait(),notify(),notifyAll()必须在同步方法/代码块中调用?2015-11-01 15:59:39FishBear_move_on阅读数 7982在Java中,所有对象都能够被作为"监视器monitor"——指一个拥有一个独占锁,一个入口队列和一个等待队列的实体entity。所有对象的非同步方法都能够在任意时刻被任意线程调用,此时不需要考虑加锁的...原创 2019-10-12 12:07:43 · 94 阅读 · 0 评论 -
Guava cache 学习01 简介 && 使用
在官方的文档说明中,Guava Cache实现了三种加载缓存的方式:LoadingCache在构建缓存的时候,使用build方法内部调用CacheLoader方法加载数据 在使用get方法的时候,如果缓存不存在该key或者key过期等,则调用get(K, Callable)方式加载数据; 直接调用put方法来放置缓存自然先看下核心实现localCache在实现上,Loca...原创 2019-09-26 21:22:51 · 113 阅读 · 0 评论 -
Guava cache学习
在官方的文档说明中,Guava Cache实现了三种加载缓存的方式:LoadingCache在构建缓存的时候,使用build方法内部调用CacheLoader方法加载数据 在使用get方法的时候,如果缓存不存在该key或者key过期等,则调用get(K, Callable)方式加载数据; 直接调用put方法来放置缓存自然先看下核心实现localCache在实现上,L...原创 2019-09-16 23:06:00 · 129 阅读 · 0 评论 -
使用Java CompletableFuture
https://blog.csdn.net/z69183787/article/details/79974128?utm_source=app前言Java 5 并发库主要关注于异步任务的处理,它采用了这样一种模式,producer 线程创建任务并且利用阻塞队列将其传递给任务的 consumer。这种模型在 Java 7 和 8 中进一步发展,并且开始支持另外一种风格的任务执行,那就是将任务...原创 2019-09-26 11:57:37 · 86 阅读 · 0 评论 -
Java 四种引用总结
在垃圾回收的时候,被释放的对象要考虑什么样的对象内存要被GC回收掉,那么怎么判断哪些对象要被回收掉呢,在java里面定义了四种引用对象,不同的引用对象在被GC扫描的时候,会有不同的处理方式,这里我们来看一下强引用强引用介绍强引用是用来描述必须存在和引用的对象,比如Object a=new Object(),只要强引用还存在,被引用的对象就永远不会被回收。强引用怎么被垃圾回收方法里面的...原创 2019-09-26 09:53:44 · 80 阅读 · 0 评论 -
Java 异步化总结01
耗时最严重的环节,启用了业务线程池处理++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++IO调用,增加callback返回结果上面就是我们全链路异步的图了(部分线程池可以优化)。全链路的核心在于只要我们遇到 IO 调用的时候,我们就可以使用 NIO,从而避免...原创 2019-09-26 10:59:45 · 104 阅读 · 0 评论 -
guava cache 源码分析01 cacheBuilder && cacheLoader
分析几个核心功能实现1.写入一段时间后duration过期2.写入后刷新缓存cacheLoader3.重新加载方法reload3.1 需要判断key不为空,原值oldValue不为空3.2 基于immediateFuture实现,创建一个ListenableFuture,这个future不能被取消或者超时, 并且isDone方法永远会...原创 2019-09-27 14:12:20 · 347 阅读 · 0 评论 -
guava cache 源码分析02 localCache01
二、Guava Cache的使用:这里简单的介绍下GuavaCache的使用:GuavaCache使用时主要分两种模式:LoadingCache和CallableCache第一种LoadingCache是一种带有加载功能的Cache实现,加载是采用初始化LoadingCache的时候指定的CacheLoader。示例如下:Guava Cache特性CacheBuilder集成了...原创 2019-09-28 10:55:01 · 165 阅读 · 0 评论 -
编程规范相关
原创 2019-09-30 11:59:12 · 80 阅读 · 0 评论 -
知识点复习0701 java基础04
Java String类为什么是final的?答:1.为了实现字符串池 2.为了线程安全 3.为了实现String可以创建HashCode不可变性 首先你要理解final的用途,在分析String为什么要用final修饰,final可以修饰类,方法和变量,并且被修饰的类或方法,被final修饰的类不能被继承,即它不能拥有自己的子类,被final修饰...原创 2019-10-07 16:06:14 · 94 阅读 · 0 评论 -
JDK 源码复习 concurrent 包 concurrentHashMap 02
1. 原理解析利用 ==CAS + synchronized== 来保证并发更新的安全底层使用==数组+链表+红黑树==来实现1.1. 重要成员变量table:默认为null,初始化发生在第一次插入操作,默认大小为16的数组,用来存储Node节点数据,扩容时大小总是2的幂次方。nextTable:默认为null,扩容时新生成的数组,其大小为原数组的两倍。sizeCtl :默认为0,...原创 2019-09-19 11:56:02 · 147 阅读 · 0 评论 -
知识点复习0702 java基础05
一、引言Cloneable接口是Java开发中常用的一个接口, 它的作用是使一个类的实例能够将自身拷贝到另一个新的实例中,注意,这里所说的“拷贝”拷的是对象实例,而不是类的定义,进一步说,拷贝的是一个类的实例中各字段的值。在开发过程中,拷贝实例是常见的一种操作,如果一个类中的字段较多,而我们又采用在客户端中逐字段复制的方法进行拷贝操作的话,将不可避免的造成客户端代...原创 2019-10-07 17:51:31 · 162 阅读 · 0 评论 -
知识点复习0703 java基础06
简要解释: 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。 序列化是为了解决在对对象流进行读写操作时所引发的问题。序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用...原创 2019-10-07 20:38:01 · 116 阅读 · 0 评论 -
知识点复习42 Java NIO 01
1.1. JavaIO读写原理无论是Socket的读写还是文件的读写,在Java层面的应用开发或者是linux系统底层开发,都属于输入input和输出output的处理,简称为IO读写。在原理上和处理流程上,都是一致的。区别在于参数的不同。用户程序进行IO的读写,基本上会用到read&write两大系统调用。可能不同操作系统,名称不完全一样,但是功能是一样的。先强调一个基础知...原创 2019-10-09 23:14:21 · 331 阅读 · 0 评论 -
Java 异步化总结02
CompletableFuture相信各位同学已经发现,CountDownLatch 虽然能实现我们需要满足的功能但是其仍然有个问题是,我们的业务代码需要耦合 CountDownLatch 的代码。比如在我们获取用户信息之后,我们会执行 countDownLatch.countDown(),很明显我们的业务代码显然不应该关心这一部分逻辑,并且在开发的过程中万一写漏了,那我们的 await ...原创 2019-09-26 11:14:06 · 98 阅读 · 0 评论