随笔分类 -  JDK源码解读

摘要:1、Unsafe介绍及源码 Unsafe 类位于 sun.misc 包下,final修饰,无法被继承。 其主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。 Unsafe的使 阅读全文
posted @ 2021-01-18 23:33 杨岂 阅读(234) 评论(0) 推荐(0) 编辑
摘要:AQS:抽象的队列同步器,是JUC包中构建锁或者其他同步组件的基础框架。 Java中的大部分同步类(ReentrantLock、ReentrantReadWriteLock、CountDownLatch、Semaphore)都是基于AbstractQueuedSynchronizer(AQS) 实现 阅读全文
posted @ 2020-10-20 18:13 杨岂 阅读(231) 评论(0) 推荐(0) 编辑
摘要:ConcurrentHashMap是在JDK5种引入的线程安全的哈希式集合,在JDK8之前采用了分段锁的设计理念,相当于Hashtable与HashMap的折中 版本,这是效率与一致性权衡后的结果。 分段锁是由内部类Segment实现的,它继承于ReentrantLock,用来管理它辖区的各个Has 阅读全文
posted @ 2019-07-02 16:42 杨岂 阅读(874) 评论(0) 推荐(0) 编辑
摘要:ArrayList是容量可以改变的非线程安全集合。内部实现使用数组进行存储(需要一块内存连续的空间),集合扩容时会创建更大的数组空间,把原有数据复制到新的数组中。 ArrayList支持对元素的快速随机访问,但是插入与删除速度通常很慢(会涉及元素的移动,时间复杂度为O(n))。 public cla 阅读全文
posted @ 2019-06-14 15:15 杨岂 阅读(168) 评论(0) 推荐(0) 编辑
摘要:Lock Lock是顶层接口,它的实现逻辑并未用到synchronized,而是利用了volatile的可见性。 public interface Lock { /** * Acquires the lock.获取锁 * 如果锁不可用,则当前线程将被禁用以用于线程调度,并处于休眠状态,直到获得锁为止 阅读全文
posted @ 2019-06-13 23:31 杨岂 阅读(714) 评论(0) 推荐(0) 编辑
摘要:了解HashMap原理之前先了解一下几种数据结构: 1、数组:采用一段连续的内存空间来存储数据。对于指定下标的查找,时间复杂度为O(1),对于给定元素的查找,需要遍历整个数据,时间复杂度为O(n)。但对于有序 数组的查找,可用二分查找法,时间复杂度为O(logn),对于一般的插入删除操作,涉及到数组 阅读全文
posted @ 2019-06-13 11:28 杨岂 阅读(1661) 评论(0) 推荐(0) 编辑
摘要:1、Hashtable是线程安全的,采用全量加锁的方式控制多线程并发访问 2、不允许null键和null值(HashMap可以接受为null的键值(key)和值(value)) 3、一次仅能有一个对象来读取和修改Hashtable,每个线程要获取或修改都要先拿到同步锁,其他线程要等待同步锁被释放之后 阅读全文
posted @ 2019-06-05 12:02 杨岂 阅读(377) 评论(0) 推荐(0) 编辑
摘要:HashMap不是线程安全的,其所有的方法都未同步,虽然可以使用Collections的synchronizedMap方法使其线程安全,但是针对的只是当前的map对象。 对此,JDK提供了线程安全的Hashtable,其所有的方法都是同步的,使用的是全局同步锁,即使用Synchronized关键字进 阅读全文
posted @ 2019-06-05 11:11 杨岂 阅读(466) 评论(0) 推荐(0) 编辑
摘要:创建线程池不允许使用Executors去创建,而是使用ThreadPoolExecutor的方式,通过使用ThreadPoolExecutor的方式我们可以根据业务需要指定适合的核心线程数最大线程数,线程空闲存活时间,任务等待队列,拒绝策略,还可以指定线程名称等。 Executors创建线程池的方式 阅读全文
posted @ 2019-04-03 20:01 杨岂 阅读(239) 评论(0) 推荐(0) 编辑
摘要:HashMap 1.8 最大的变化就是引入红黑树数据结构。 数据结构为数组+链表+红黑树。当链表的长度大于8,且总的元素大小大于等于64时,将链表修改为红黑树(时间复杂度为 O(logn)),将原来链表数据复制进去。 问题? 1、链表的长度大于8就转为红黑树吗? 不是,需要满足新增元素时链表的长度已 阅读全文
posted @ 2019-04-02 18:46 杨岂 阅读(204) 评论(0) 推荐(0) 编辑
摘要:一、前言 如果每个线程在创建的时候都有个初始值,如每个线程都分配一个线程号;针对每个请求线程需要包含请求的参数等一些信息,所以可以构造这样一个对象,将这个对象设置为共享 变量,统一设置初始值,但是每个线程对这个值的修改都是相互独立的。这个对象就是ThreadLocal,可以理解为:CopyValue 阅读全文
posted @ 2019-03-21 21:02 杨岂 阅读(867) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示