JUC
文章平均质量分 91
煎丶包
这个作者很懒,什么都没留下…
展开
-
ThreadLocal从变量副本的角度解决多线程并发安全问题
ThreadLocal从变量副本的角度解决多线程并发安全问题之前我们讲的高并发场景下的线程安全问题,可以使用Synchronized同步关键字、Lock手动加锁的方式去解决,什么轻量级锁、偏向锁、重量级锁、可重入锁等等,实际上本质都是控制线程,使得多个线程同步的去访问共享资源。之所以多线程存在线程安全问题,就是因为多个线程访问同一个共享资源导致的,多个线程之间属于竞争关系,很容易就会导致数据的不安全。我们说了加锁实际上保证了各个线程之间同步、有序的去访问共享资源,难道不加锁就没有办法解决多线程安全问题原创 2021-10-03 18:56:39 · 780 阅读 · 0 评论 -
【源码】走一遍源码弄清ArrayList容器的扩容机制
【源码】走一遍源码弄清ArrayList容器的扩容机制首先我们来看看ArraysList容器在整个Java集合框架中所处的位置由此可见ArrayList是Java集合框架中,两大派系中Collection接口的子接口List的实现类我们从源码入手可以看到ArrayList底层数据结构实际上是一个**Object类型的数组**,由于Object是所有类的父类,所以ArrayList集合可以存放任意类型的元素,并且存放的元素是有序的、可重复的、可随机访问的。接下来我们就以add()方法为突破口,来解原创 2021-10-01 16:00:23 · 482 阅读 · 0 评论 -
从ThreadPoolExecutor源码着手来谈一谈并发中使用的线程池
从ThreadPoolExecutor源码着手来谈一谈并发中使用的线程池线程池,关键在于一个**“池”字,你可以联想一下数据库连接池、字符串常量池等等,都是实际上都是利用池化技术**来减少每次获取资源的消耗,提高对资源的利用率。在高并发多线程的场景下,某个时间段内肯定不只有一个线程在工作,而是有大量的线程同时在执行任务。当面对大量的请求等待处理时,我们不可能一个一个的创建出线程,然后分配请求任务让这个线程去处理,这样效率也太低了。怎么解决呢?我们想如果说事先创建好了很多线程,随时待命,一旦有请求发送过来,原创 2021-09-16 17:22:25 · 181 阅读 · 0 评论 -
从Java内存模型的角度来解读volatile关键字
从Java内存模型的角度来解读volatile关键字在之前关于高并发线程同步控制的文章中,我们讲了Synchronized关键字的作用以及底层JVM的实现原理,也讲了另一把ReentrantLock可重入锁的作用及底层源码的实现。而为了保证多线程情况下线程之间的同步,除了加锁以外,还可以使用volatile关键字,它是JVM提供的一个轻量级的同步机制。首先我们要明确并发编程的3个重要特性:原子性一次操作或者多次操作,要么所有的操作全部都执行并且不会受到任何外界因素的干扰而中断,要么就全部都不执行原创 2021-09-14 20:26:50 · 159 阅读 · 0 评论 -
从AQS切入谈一谈不逊色于Synchronized的ReentrantLock可重入锁
从AQS切入谈一谈不逊色于Synchronized的ReentrantLock可重入锁之前在《结合JVM深入谈一谈Synchronized关键字的神奇之处》这篇文章中,提到了Synchronized和ReentrantLock的区别,Synchronized是依赖于JVM实现的,是JVM层面的锁,并且它的优化也是从JVM底层进行优化的。而ReentrantLock可重入锁是API层面的,ReentrantLock这个类实现了Lock这个接口,需要我们使用lock()和unlock()方法手动的进行加锁和释原创 2021-09-13 20:53:25 · 3721 阅读 · 0 评论 -
结合JVM深入谈一谈Synchronized关键字的神奇之处
结合JVM深入谈一谈Synchronized关键字的神奇之处今天就来聊一聊Synchronized这个关键字。一提到Synchronized这个关键字,可能你马上联想到同步、加锁、多线程并发等等这些词语,仿佛感觉Synchronized关键字出镜率很高,感觉哪里都有它的身影。其实,Synchronized在很早的JDK版本中就已经存在了,可以说是元老级别的存在,主要解决的是多线程之间同步的访问资源,被Synchronized关键字修饰的方法或者代码块在任意时刻只能有一个线程执行。在早期的JDK版本中,S原创 2021-09-11 19:49:35 · 161 阅读 · 0 评论 -
扒一扒HashMap和ConcurrentHashMap的本质(万字总结!一篇入魂!)
扒一扒HashMap和ConcurrentHashMap的本质Java集合,或者说Java容器,可以分为两大派系,一类是实现了Collection接口的容器,另一类是实现了Map接口的容器。这篇文章要将的就是实现了Map接口的HashMap集合。先来看一下Map接口整体的框架HashMapHashMap集合是线程不安全的,在JDK 8 之前HashMap是由数组+链表组成的,数组是HashMap的主体部分,链表则是主要为了解决hash冲突而存在的,主要是采用拉链法解决冲突。到了JDK 8及以后原创 2021-09-06 10:10:02 · 223 阅读 · 0 评论 -
JMM详解与volatile关键字
一、Java内存模型——JMMJMM本身是一种抽象的概念,并不真实存在,它描述的是一组规则或者规范,就想JVM一样通过JMM规范定义了程序中各个变量(包括实例字段、静态字段和构成数组对象的元素)的访问方式JMM的可见性、原子性、有序性使得线程安全得到保证其中JMM对同步做出了规定:线程加锁前,必须读取主内存的最新值到自己的工作内存线程解锁前,必须把共享变量的值刷新回主内存加锁解锁必须是同一把锁由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存,工作内存是每个线原创 2021-08-10 15:45:53 · 155 阅读 · 0 评论