
Java
文章平均质量分 83
Java
SmallKa0
CCPC银牌 ICPC银牌 双非acmer
展开
-
ConcurrentSkipListMap
ConcurrentSkipListMap是基于SkipList实现的有序且线程安全的Map。为什么要使用跳查表实现呢?因为目前计算机领域还没找到一种高效的、作用在树上的、无锁的、增加和删除节点的办法。原创 2024-05-21 23:42:39 · 824 阅读 · 0 评论 -
JDK8 ConcurrentHashMap源码解析
4、把元素放入槽内。在第一次扩容的时候,sizeCtl会被设置为一个很大负数,之后每一个线程扩容的时候sizeCtl+1,每一个线程扩容完成之后,sizeCtl减1。2、加锁的粒度,并非整个ConcurrentHashMap,而是对每个头节点加锁,即并发度就是Node数组的长度,初始长度为16,和在JDK7中的Segment的个数相同。3、在线程扩容未完成之前,有的数组下标已经迁移完毕,有的还在旧的HashMap中,当使用get的时候还是会访问旧的HashMap,怎么处理呢?3、提供扩容的并发度。原创 2024-05-21 23:02:43 · 935 阅读 · 0 评论 -
JDK7 ConcurrentHashMap源码解析
第二个参数是负载因子,传给了Segment的内部,当每个Segment的元素个数达到一定阈值,进行rehash。,对链表尾部一串新hash值相同的一个子链表,不需要一个个移动,只需要将lastRun位置的节点连接到新数组中。扩容后数组变成两倍原数组大小,新的hash值有两种可能,1.原hash值,2.原hash值加上原数组长度。,一次对Segment数组hash,一次对HashEntry数组进行hash。为了提高hash的计算性能,会保证数组的大小始终是2的整数次方。,若没有发现重复的节点,则。原创 2024-05-21 20:37:45 · 466 阅读 · 0 评论 -
并发容器BlockingQueue/Deque、CopyOnwrite、ConcurrentLinkedQueue扫盲
add----当队列满时会抛出异常 remove----当队列空时会抛出异常offer----当队列满时会返回false peek----当列队空时会返回NULLput----当队列满时阻塞 take----当队列空时阻塞。原创 2024-05-21 19:46:20 · 718 阅读 · 0 评论 -
同步工具类-Sempaphone、CountDownLatch、CyclicBarrier、Exchanger
Slot用于交换数据,保存其中一个线程的数据,当第二个线程到时,进行数据交换。一个Slot只能支持2个线程之间交换数据,要实现多个线程并行的交换诗句,需要多个Slot,因此在Exchanger里面定义了Slot数组。每个线程在调用exchange函数交换数据的时候,会先创建一个Node对象,这个Node对象包含了要交换的数据,线程本身,对方所要交换的数据,初始为NULL。假设有n个线程来获取资源n>10,那么n个线程中只有10个能获得资源,其他线程都会阻塞,直到有现成释放了资源。原创 2024-05-21 00:47:47 · 1914 阅读 · 0 评论 -
StampedLock详解
StampedLock的写锁是不可重入锁。使用的数据结构不是AQS,是类似于AQS的队列,在自旋加入队列时也会去抢锁。维护了一个读线程的链表,唤醒一个则唤醒全部。StampedLock不响应中断。当被中断信号唤醒时会不断自旋占用CPU。原创 2024-05-19 23:35:18 · 838 阅读 · 0 评论 -
Conditon源码详解
Condition有两个核心方法await和signal方法,调用时必须获取到Lock锁。Condition里维护等待队列的是一个单向链表。阻塞时在等待队列中插入一个condition节点,然后先释放锁再park阻塞。被唤醒时通过查看是否在AQS同步队列中判断是否是被signal唤醒的。是-重新拿锁。释放时,从等待队列中取头节点,将状态改为初始状态,然后加入到AQS队列中调用unpark唤醒。一、Condition与Lock的关系。原创 2024-05-19 12:26:55 · 339 阅读 · 0 评论 -
读写锁详解
和互斥锁相比,读写锁就是读线程和读线程之间可以不用互斥。其实现为同一把锁的两个试图而已。可以理解为是一把锁,线程分为两类,读线程和写线程互斥,写线程和线程也互斥。共用同一个AQS。state变量拆成两半,一半表示写锁,一半表示读锁。原创 2024-05-19 02:16:09 · 1729 阅读 · 0 评论 -
Lock互斥锁详解
ReentrantLock 是JDK1.5 引入的J.U.C包中的一个比较重要的可重入的、互斥的并且支持公平和非公平的锁,其实现了 Lock接口,其内部是通过 AQS + CAS 原理实现的。其具备 synchronized 关键字加锁的所有功能,并且还具备一些 synchronized 锁不具备的功能,比如:尝试拿锁,支持中断、支持超时等待等。原创 2024-05-19 01:31:19 · 2041 阅读 · 0 评论 -
synchronized原理详解
由于轻量级锁会自旋,即不会放弃CPU,那么对一些执行时间短的任务而言,用轻量级锁可以减少线程切换的时间(对比重量级锁)。偏向锁通过对比 Mark Word 解决加锁问题,避免执行CAS操作。轻量级锁是通过用 CAS 操作和自旋来解决加锁问题,避免线程阻塞和唤醒而影响性能。重量级锁是将除了拥有锁的线程以外的线程都阻塞。原创 2024-05-17 23:50:16 · 336 阅读 · 0 评论 -
Atomic类
对原子类知识进行梳理。原子类基于CAS函数实现,采用的乐观锁的实现方式。Unsafe提供了Integer、Long、Object的CAS操作函数。对应的类有AtomicInteger、AtomicLong、AtomicReference对ABA问题的解决:AtomicStapedReference、AtomicMarkableReference。通过引入版本号来实现,要同时进行两个值的CAS所以只能实现引用对象的Atomic类。原创 2024-05-17 23:22:37 · 1200 阅读 · 0 评论 -
多线程基础
1. 单线程中的每个操作 happend-before任意后续操作2. 对volatile变量的写入,happen-before对应后续对这个变量的读取。3. 对synchronized的解锁,happen-before对应后续对这个锁的加锁。4. happen-before的传递性5. final变量的写可见于后续的final变量的读。(3)原理在编译器和CPU层面都有对应的指令,也就是内存屏障。编译器的内存屏障只是为了告诉编译器不要对执行进行重排序。原创 2024-05-17 01:35:00 · 858 阅读 · 0 评论 -
抽象类、接口、Lambda、内部类
6.1 抽象类抽象类是指定义时有 abstract 修饰的类,例如:public abstract class Person{ ... public abstract String getDescription();//注意末尾没有花括号,而有分号}在定义中有abstract修饰符的方法是抽象方法。抽象类中可以包含实例变量和实例方法,甚至可以没有抽象方法,但是有抽象方法的类一定要定义为抽象类。抽象方法充当着占位的角色,它们的具体实现在子类中。抽象方法不能有方法体,即没有花括号,但必须原创 2024-05-16 23:17:11 · 715 阅读 · 0 评论 -
Java泛型程序设计
java代码中,判断两个方法是否是同一个方法是根据方法的签名来决定的,方法的签名是不包含方法的返回值的,也就是“方法签名=方法名+参数”。那上面这个两个方法不就冲突了吗,没错,如果我们代码里面这样写确实是冲突了,但是Java虚拟机中的方法签名规则是不同的,其“方法签名=方法名+参数+返回值”,所以他是能正确区分两个方法的,所以字节码中是允许存在上面这种情况的。当然这种情况不只是在使用泛型的时候会出现,当在重写方法时,指定了一个更加严格的返回值类型,虚拟机会帮我们生成桥方法。称为有协变的返回类型。原创 2024-05-15 16:22:09 · 1112 阅读 · 0 评论 -
Java反射知识梳理
反射原创 2024-05-15 00:12:18 · 892 阅读 · 0 评论