JDK
dragon@oo
糟糕的坚持也好过放弃
展开
-
java对象以及synchronized锁过程详解
一、java对象组成部分java对象存储在内存中,共分为以下三个部分1)、对象头2)、实例数据3)、对齐填充字节二、对象头java对象头有以下三部分组成:1)、Mark Word2)、Class Metadata Address(指向类的指针)3)、Array Length(数组长度,只有数组对象才有)JVM中对象头的方式有以下两种(以32位JVM为例):1.1、普通对象:|------------------------------------------原创 2020-08-31 17:53:09 · 1396 阅读 · 0 评论 -
volatile 和 synchronized 详解
一、背景提起并发编程,我们不得不说起 volatile 和 synchronized 这两个关键字,这两个关键字也是面试中常常被问到的,下面我们分别介绍一下这两个关键字以及二者的异同首先我们先理解关于线程安全的两个名词:内存可见 和 执行顺序内存可见:顾名思义就是线程执行结果在内存中对其它线程的可见性执行顺序:控制代码的执行顺序及是否可以并发执行二、volatilevola...原创 2019-11-20 16:54:42 · 2566 阅读 · 0 评论 -
AQS源码
一、前沿AQS 全称是 AbstractQueuedSynchronizer,即 抽象队列同步器,它底层采用了 CAS 技术保证了操作的原子性,同时利用 FIFO 队列实现线程间的锁竞争。作为基础的功能->同步抽象到了 AQS 中,这也是 JDK 并发包中 ReentrantLock、CountDownLatch、Semaphore、ReentrantReadWriteLock 等同步工...原创 2019-12-04 18:12:53 · 172 阅读 · 0 评论 -
JDK动态代理UndeclaredThrowableException异常
UndeclaredThrowableException异常背景最近项目上出现了JDK动态代理UndeclaredThrowableException异常,此异常之前没有接触过,那么该异常将会导致什么呢?UndeclaredThrowableException后果:导致该抛出的直接异常信息被包装了好几层,异常看起来很费事,如下图:产生原因要了解其原因的前提条件是必须了解检查型...原创 2019-06-17 15:19:03 · 26342 阅读 · 0 评论 -
JDK动态代理文件$Proxy0.class的生成和查看
网上讲了好多种方法,但经过测试,都不太中意,下面结合自己的实践给大家介绍一下JDK动态代理文件如何生成和查看背景条件idea中JDK动态代理文件的生成和查看demo介绍JDK动态代理文件的生成有两个条件:1、必须在main方法中执行,直接用junit的test方法调用无法生成2、在main方法最前面增加System.getProperties().put("sun.misc...原创 2019-06-17 11:19:04 · 6395 阅读 · 5 评论 -
HashMap源码
数组:数组存储区间是连续的,占用内存严重,故空间复杂度很大,但数组的二分查找时间复杂度很小,为 o(1),数组的特点:查找速度快、插入和删除效率低链表:链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,为 o(n),链表的特点:查找速度慢、插入和删除效率高哈希表:综合了数组和链表的特性,不仅查找速度快,插入和删除的效率也很高,哈希表有多种不同的实现方式,下面我们就介绍...原创 2019-06-10 17:53:55 · 9011 阅读 · 9 评论 -
ConcurrentHashMap源码
一、ConcurrentHashMap 简介1、ConcurrentHashMap 结构图如下:2、众所周知,ConcurrentHashMap 是线程安全的,在JDK1.7中,ConcurrentHashMap 采用分段锁(segment)的机制实现线程安全,而在JDK1.8中,ConcurrentHashMap 抛弃了分段锁的设计,而是采用CAS+Synchronized来保...原创 2019-06-10 17:44:04 · 392 阅读 · 0 评论 -
ThreadLocal源码
1、作用:threadlocal提供了线程内的局部变量,相比较锁而言,它是空间换时间思想,使得每个线程访问属于自己独立的变量副本。2、结构:每个Thread维护一个ThreadLocalMap,ThreadLocalMap中存储的是一个Entry[] table数组,Entry 中key是ThreadLocal,value是ThreadLocal中设置的值,如下图所示:...原创 2019-06-10 17:41:55 · 1639 阅读 · 0 评论 -
ArrayList源码
1、ArrayList介绍ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。1)ArrayList 继承了AbstractList,实现了List。它是一个数组队列,提供了相关的添加、删除、修...原创 2019-06-10 17:40:51 · 699 阅读 · 0 评论 -
ThreadPoolExecutor源码
一、为什么要使用线程池:线程池维持一定数量的线程不断得从队列中获取任务执行,相比不断的创建线程来执行任务而言,大大地提高了系统执行效率,因为频繁的创建和销毁线程很耗时间,提高线程的可管理性。二、线程池原理:创建了一大堆线程和一个BlockingQueue队列,一大堆线程不断地从队列中获取任务并执行三、线程池核心参数:1)corePoolSize:核心线程池数量,当线程池...原创 2019-06-10 17:38:48 · 397 阅读 · 0 评论 -
CyclicBarrier源码
一、CyclicBarrier简介 CyclicBarrier 就是循环(Cyclic)使用的屏障(Barrier),它要做的事情就是让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会打开,所有被屏障拦截的线程才会继续运行。应用示例demo如下:CyclicBarrier 还提供了一个更高级的构造函数Cyclic...原创 2019-06-13 10:42:48 · 274 阅读 · 0 评论 -
ReentrantLock源码
ReentrantLock(可重入锁) ReentrantLock 感觉上是 Synchronized 的增强版,二者都是可重入锁,Synchronized的特点是使用简单,一切都交给JVM去处理,但是在功能上比较薄弱。ReentrantLock相比Synchronized在功能上更加丰富,它具有可重入、可中断、可限时、公平锁等特点,首先通过一个简单的例子了解一下它的用法...原创 2019-06-13 10:21:12 · 252 阅读 · 0 评论 -
ReentrantReadWriteLock源码
之前提到的锁(如Metux 和 ReentrantLock)基本都是排他锁,这些锁在同一时刻只允许一个线程访问,而读写锁(ReentrantReadWriteLock)在同一时刻允许多个读线程访问,但是在写线程访问时,所有的读线程和写线程都会被阻塞。读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大提升。多个读锁不互斥,读锁和写锁互斥,...原创 2019-06-13 10:16:31 · 398 阅读 · 0 评论 -
CountDownLantch源码
一、类介绍 CountDownLantch 倒数计时器,一个同步辅助类,一个线程(或者多个),等待另外N个线程完成某个事情后才能执行。用于给定的计数初始化 CountDownLantch ,由于调用了 countDown()方法,所在在当前计数到达零之前,await()方法会一直受阻塞。之后会释放所有等待的线程,await 的后续调用都将立即返回。注意:这种现象只出现一次,即Co...原创 2019-06-13 10:11:07 · 1235 阅读 · 0 评论