多线程
文章平均质量分 84
从底层理解锁,然后使用锁
用针戳左手中指指头
you can do it
展开
-
Netty中的ByteBuf使用介绍
有三类:当在需要时,用这个类进行获取,它提供了3中类型的获取。在中使用方式例如下面再入站里的调用:它由上下文对象调用方法获取。我们先看下下面这几个API,需要熟悉理解的:虽然上面注释有写过,但还是再提醒一遍;表示可以被读取数据的开始索引,或者说已经读取了readerIndex个字节;表示可以被写入数据的开始索引,或者说已经写入了writerIndex个字节;丢弃的是读取过的字节数据,同时会相应减少对应的字节长度;看几个例子,再次加深记忆:结果如下:对于上面的操作,可以看下面这个图解:资源释放针对的原创 2024-06-07 21:23:54 · 962 阅读 · 0 评论 -
JDK 8 ConcurrentHashMap源码解读
7和8 的结构还是有些不一样final V putVal(K key, V value, boolean onlyIfAbsent) { if (key == null || value == null) throw new NullPointerException(); int hash = spread(key.hashCode()); // 链表长度统计 int binCount = 0; for (Node<K,原创 2020-08-11 21:38:04 · 196 阅读 · 1 评论 -
JDK 8 HashMap源码解读
开始进入HashMap前,先了解一下知识,这样才能更好的理解源码。开始前预习关于二叉树的知识点摘自:https://www.jianshu.com/p/bf73c8d50dc2推荐看原文;树的相关知识只作为回顾,不会详细说明。树树:有且仅有一个特定的成为根的节点当n>1时,其余节点可分为m(m>0)个互不相交的有限集 T1、T2、…、Tn,其中每一个集合本身又是一棵树,并且称为根的子树。此外,树的定义还需要强调以下两点:n>0时根结点是唯一的,不可能存在多个根结点原创 2020-08-01 21:54:48 · 244 阅读 · 0 评论 -
JDK 7 ConcurrentHashMap源码解读
原理分析HashMap存在并发问题,jdk有提供HashTable,这个HashTable是对HashMap中的所以方法加锁以达到线程安全,但是,这种方式会使得性能下降,看下面的图,假如有两个线程分别要put kk3和kk4,第一个线程最快,它对kk3进行put操作,这时另一个线程要put kk4就要等待,问题是,这两个元素所要put的位置,互不相干,但还是需要等待,这造成了一种资源浪费,所以才会出现ConcurrentHashMap,它分段式加锁,就能很大程度上避免下面的情况。[外链图片转存失败,源原创 2020-07-07 22:02:33 · 187 阅读 · 0 评论 -
JDK 7 HashMap源码解读
存储原理数组是最基本的数据结构,ArrayList内部就是数组实现的,下标定位位置,然后在数组下标位置存放元素,每添加一个元素,下标就+1,map和list有一点相似,就是内部也有个数组, 它通过key存放获取对象,以key计算数组下标。使用hashCode的话,得出的值很大,很容易是数组越界,可以使用取余的方式减小这个,那么余多少呢?比如下标是0-7,那么我们可以余它的数组大小(length),hashCode是随机的,得出的下标也是随机的,这也使得数组下标随机平均。但还有一个问题,hashCode原创 2020-07-06 00:44:10 · 227 阅读 · 0 评论 -
多线程7 ReentrantLock原理
ReentranclLock加锁原理1.第一个线程进来FairSync里的lock方法final void lock() {// 加锁成功后,修改的值 acquire(1);}其抽象父类的方法public final void acquire(int arg) { if (!tryAcquire(arg) && acqui...原创 2020-04-26 16:53:29 · 304 阅读 · 0 评论 -
多线程6 - CAS和AQS的应用和原理
java里有两种锁 synchronized (jvm内部实现) lock (jdk源码实现) synchronized在jdk6之前加锁方式是重量级锁,之后因为Lock锁的出现,synchronized进行了优化,才有的偏向锁/轻量级锁,两者性能差不多,但lock提供了一些比synchronized更高级的功能。那么Doug Lea是怎样写的同步锁呢?...原创 2020-04-26 16:31:12 · 420 阅读 · 0 评论 -
多线程五 锁的膨胀过程
轻量级锁什么时候发生的? 单个线程 多个线程交互执行 多个线程互斥执行 当一个线程去拿一个资源的时候,发现得不到资源,然后就自旋一段时间,然后再去拿,如果再拿不到,那么久会膨胀,具体的自旋时间需要看jvm源码。 可以这样理解:一个线程去拿一个不属于自己线程的资源时,就会膨胀(不是很准确) public static void main(String[] ...原创 2020-04-07 21:29:18 · 266 阅读 · 0 评论 -
多线程四 并发中锁的原理
先来引入锁的概念:偏向锁:当前只有一个锁,无线程竞争的情况下,尽量减少不必要的轻量锁的执行路径。偏向锁就是在运行过程中,对象的锁偏向某个线程,即在开启偏向锁的情况下,某个线程获得锁,当该线程下次想要获得锁时,不需要再获取锁(忽略synchronized关键字),直接执行代码轻量锁:存在锁之间的竞争,但竞争的会很小,重量锁:存在资源竞争openjdk对对象头的注释// 6...原创 2020-04-06 19:21:20 · 524 阅读 · 2 评论 -
多线程三 并发容器简单使用
1.threadLocal本地线程变量,在每个线程会独立开辟内存空间。在高并发先不要使用。private static ThreadLocal local = new ThreadLocal();public static void main(String[] args) { new Thread(()->{ try { Ti...原创 2020-04-06 17:26:33 · 508 阅读 · 2 评论 -
多线程二 多线程了解与使用
1.synchronized锁有两种: 1.类的实例 2.类对象第一种类对象 public static void test(){ System.out.println(Thread.currentThread().getName()+" start "); try { TimeUnit.SECOND...原创 2020-04-06 11:09:23 · 131 阅读 · 2 评论