
Java常用知识点
文章平均质量分 70
Java常用知识点
一丸猿
这个作者很懒,什么都没留下…
展开
-
HashMap(JDK1.8)
数据结构:数组+链表+红黑树(Java8)原理底层采用链表数组;初始容量为:2^4,且容量为2^n;而Hashtable初始化容量大小为11,且都为素数;所以操作HashMap主要分两步:1.在数组中找到正确的链表;2.在链表中找到正确的元素(遍历链表);而对于上面的第一步,又分两个步骤: hash :该方法主要是将Object转换成一个整型; inde...原创 2021-06-24 16:07:48 · 196 阅读 · 0 评论 -
Netty
Java 的AIO重要的三个类:AsynchronousServerSocketChannel(服务端)、AsynchronousSocketChannel(客户端)和CompletionHandler(用户处理器)CompletionHandler接口实现应用程序向操作系统发起IO操作Buffer的基本用法就是:初始化(allocate)–> 写入数据(read / put)–> 转换为写出模式(flip)–> 写出数据(get)–> 转换为写入模式(compact)–&g原创 2021-06-12 10:44:15 · 1176 阅读 · 1 评论 -
Object--wait & notify/notifyAll
1、wait()、notify/notifyAll() 方法是Object的本地final方法,无法被重写。2、wait()使当前线程阻塞,前提是 必须先获得锁,一般配合synchronized 关键字使用,即,一般在synchronized 同步代码块里使用 wait()、notify/notifyAll() 方法。3、 由于 wait()、notify/notifyAll() 在synchronized 代码块执行,说明当前线程一定是获取了锁的。 当线程执行wait()方法时候,会...原创 2021-05-21 10:57:14 · 145 阅读 · 0 评论 -
synchronized的实现原理
作用1. 原子性,保证代码块同一时间只被一个线程访问到;2. 可见性,在进入同步代码块后,保证被锁变量取到的值就是真实值;(利用了java的内存模型特性:对一个变量unlock操作之前,必须要同步到主内存中;如果对一个变量进行lock操作,则将会清空工作内存中此变量的值,在执行引擎使用此变量前,需要重新从主内存中load操作或assign操作初始化变量值)3. 有序性,有效解决代码重排问题,即unlock和lock操作倒置执行的问题;(实际上,synchronize是无法禁止指令重排和处理器优化原创 2021-03-10 15:17:30 · 929 阅读 · 0 评论 -
volatile的实现原理
原理为了提高处理器的执行速度,在处理器和内存之间增加了多级缓存来提升。但是由于引入了多级缓存,就存在缓存数据不一致问题;但是,对于volatile变量,当对volatile变量进行写操作的时候,JVM会向处理器发送一条lock前缀的指令,将这个缓存中的变量回写到系统主存中;但是就算写回到内存,如果其他处理器缓存的值还是旧的,再执行计算操作就会有问题,所以在多处理器下,为了保证各个处理器的缓存是一致的,就会实现缓存一致性协议;缓存一致性协议每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值原创 2021-03-10 15:43:58 · 98 阅读 · 0 评论 -
AbstractQueuedSynchronizer解析
位于java.util.concurrent.locks原创 2021-05-08 18:07:29 · 271 阅读 · 0 评论 -
JAVA的锁
乐观锁乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。java 中的乐观锁基本都是通过Unsafe的CAS(Compare And Swap,翻译过来就是比较并替换)操作实现的;悲观锁悲观锁是就是悲观思想,即认为读少写多,遇到并发写的可能性高,每次去拿数..原创 2021-05-08 18:10:29 · 113 阅读 · 0 评论 -
ReentrantLock
支持两种实现模式:非公平、公平非公平锁的非公平性用以下例子来解释:持有锁的线程A正在running,队列中有线程BCDEF被挂起并等待被唤醒; 在某一个时间点,线程A执行unlock,唤醒线程B; 同时线程G执行lock,这个时候会发生什么?线程B和G拥有相同的优先级,这里讲的优先级是指获取锁的优先级,同时执行CAS指令竞争锁。如果恰好线程G成功了,线程B就得重新挂起等待被唤醒。public class ReentrantLock implements Lock, java.io.S.原创 2021-05-08 21:21:48 · 93 阅读 · 0 评论 -
ReentrantReadWriteLock
ReentrantReadWriteLock包含了两个锁,一个是读操作相关的锁,称为共享锁;一个是写相关的锁,称为独占锁;线程进入读锁的前提条件:没有其他线程的写锁,没有写请求或者有写请求,但调用线程和持有锁的线程是同一个。线程进入写锁的前提条件:没有其他线程的读锁没有其他线程的写锁而读写锁有以下三个重要的特性:(1)公平选择性:支持非公平(默认)和公平的锁获取方式,吞吐量还是非公平优于公平。(2)重入:读锁和写锁都支持线程重进入。(3)锁降级:遵循获取写锁、获取读锁再释放原创 2021-05-10 10:22:55 · 92 阅读 · 0 评论 -
Java--JUC并发工具
ReentrantLockReentrantReadWriteLockCountDownLatch (信号量)CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信;主要方法:构造一个用给定计数初始化的 CountDownLatch。CountDownLatch(int count)// 使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。void await()// 使当前线程在锁存器倒计数至零之前一直等待,除..原创 2021-05-21 10:21:35 · 153 阅读 · 0 评论