
多线程
文章平均质量分 64
想睡觉的小码农
我这个人很懒,什么也没有说
展开
-
线程内部存储ThreadLocal
1、是什么?并发访问共享变量的时候可以考虑加锁控制(synchornized、Lock锁、volatile+cas)这种方式对内存友好,不用额外的开辟线程内的存储空间,但是并发的时候要互斥访问对效率不太友好;早在JDK1.2的就提供了ThreadLocal的线程内部存储机制来解决并发访问题。设计思想是在线程内部存储共享变量的副本,在线程存活的过程中可以随时随意场景中取到自己保存的变量副本。2、怎么使用?import java.util.concurrent.TimeUnit;publi原创 2021-09-17 16:41:26 · 610 阅读 · 1 评论 -
JUC线程池
目录1、线程池是什么?2、为什么要使用线程池?3、JUC中线程池的三大线程池3.1获取单一线程的线程池 newSingleThreadExecutor()3.2获取固定数量线程的线程池 newFixedThreadPool(int nThreads)3.3获取线程数量可伸缩的线程池Executors.newCachedThreadPool()4、获取线程池的7大参数5、自定义一个线程池6、四种拒绝策略6.1AbortPolicy()6.2DiscardPolic.原创 2021-07-06 22:36:47 · 206 阅读 · 0 评论 -
JUC之常用辅助类-cyclicBarrier、CountDownLatch、Semaphore
在我个人理解下,这几个JUC包中的辅助类,实质上其实就是线程间的通信,只不过它们适用于不同的场景下。1、CountDownLatch(减法计数器)我们可以把它理解为一个加法计数器,计数器只有达到我们预先的设定的值之后,执行await方法的线程才可以继续往下执行。demopackage juctest;import java.util.concurrent.CountDownLatch;public class CountDownLatchTest { public stati原创 2021-07-06 00:00:50 · 210 阅读 · 0 评论 -
jdk1.8下的ConcurrentHashMap源码分析
1 、构造函数 1.1空参构造函数 /*** Creates a new, empty map with the default initial table size (16).*/public ConcurrentHashMap() {} 1.2指定初始化容量的构造函数public ConcurrentHashMap(int initialCapacity) {if (initialCapacity < 0)//...原创 2021-07-02 17:02:24 · 235 阅读 · 0 评论 -
线程等待唤醒--生产者消费者模式
1、synchronized版在生产线程执行生产proucet()方法时先判断总量,如果sum>0,即库存里还有没有被消费线程消费的食物就等待wait(),wait()方法会释放锁,让消费线程先占用锁去调用消费方法。同理,消费线程进入判断,如果sum=0,即生产者还没有生产出食物,或者食物在这一刻被消费线程消费光了,那就需要等待消费者生产食物。判断为什么要用while循环而不是if?防止虚假唤醒。比如当个第一个生产者A进入product()方法,if判断...原创 2021-06-30 13:09:15 · 219 阅读 · 0 评论 -
synchronized到底锁的是什么??
先说结论,锁无非是锁两种:非静态方法锁的当前实例对象this 静态方法锁的是当前类的class对象 代码块锁的是指定的对象1、synchronzed修饰普通方法package juctest;import java.util.concurrent.TimeUnit;public class LockTest1 { /** * 两个线程访问同一个synchronzied修饰的方法,资源类 * 其中谁先抢占着锁谁先执行。 * synchronzie原创 2021-06-30 11:40:09 · 277 阅读 · 0 评论 -
关于不安全的集合类与解决替代方案1-ArrayList
List --ArrayListArrayList底层是维护了一个数组。ArrayList线程不安全,因为其add等方法没有synchronized关键字修饰,也没有任何同步加锁处理。 public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; }原创 2021-06-28 17:04:32 · 348 阅读 · 0 评论 -
原子引用与ABA问题的解决
1、原子引用1.1 AtomicReferencejava.util.concurrent.atomic包中不仅有原子基本类型像AtomicInteger、AtomicBoolean等基本原子数据类型。如果我们有像User类、Org类这种引用数据类型,那么JUCA包中也为我们提供了AtomicReference原子引用。具体使用如下。 User u = new User(); //原子引用 AtomicReference<User> atomicRefer原创 2021-06-28 12:52:18 · 441 阅读 · 0 评论 -
CAS的缺点
1、循环时间长,开销大cas方法底层有一个do....while....循环。以Unsafe的getAndAddInt为例 public final int getAndAddInt(Object var1, long var2, int var4) { int var5; do { var5 = this.getIntVolatile(var1, var2); } while(!this.compareAndSwapIn原创 2021-06-28 11:17:02 · 1152 阅读 · 0 评论 -
cas是如何保证原子性的??
目录一、volatile关键字volatile的特性1、保证可见性2、不保证原子性3、禁止指令重排序二、AtomicInteger&&CAS&&Unsafe一、volatile关键字volatile的特性可见性 不保证原子性 有序性(禁止指令的重排序)1、保证可见性在我们java内存中,有主内存(公共内存)和工作内存(线程内的私有内存)。在我们多线程访问的时候,需要先将主内存(公共内存)中的数据拷贝一份到线程的工作内存(线程私有内原创 2021-06-24 23:25:46 · 3675 阅读 · 2 评论 -
JAVA中阻塞队列的类别和区别(转载)
这篇文章将介绍什么是阻塞队列,以及Java中阻塞队列的4种处理方式,并介绍Java 7中提供的7种阻塞队列,最后分析阻塞队列的一种实现方式。阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。1)支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。2)支持阻塞的移除方法:意思是在队列为空时,获取元素的线...转载 2020-01-01 15:00:29 · 872 阅读 · 0 评论 -
线程池—JDK中的四种线程池
一:newFixedThreadPool(固定长度)//创建一个固定线程长度的线程池ExecutorService treadpool=Executors.newFixedThreadPool(3);核心线程数和最大线程数都是指定值,也就是说当线程池中线程数超过核心线程数后,任务都会被放到阻塞队列中因此该线程池执行任务的流程如下:线程数少于核心线程数时,新建线程执行任务 线程...原创 2019-12-30 20:32:06 · 213 阅读 · 0 评论 -
线程池—线程池中的参数与线程池的处理流程
线程池中的重要参数:corePoolSize:核心线程数,通俗的说就是队列没满时,最大线程并发数 workQueue: 阻塞队列类型 maximumPoolSizes:最大线程数,通俗的说就是当阻塞队列满了的时候,最大的并发数 RejectedExecutionHandler:拒绝策略,当任务数超过maximumPoolSizes + workQueue 时,任务会触发拒绝策略。JDk有...原创 2019-12-30 20:01:51 · 867 阅读 · 0 评论 -
多线程JUC(一)
"了解JUC吗?" 很多面试中面试官都会问你这个多线程相关的问题,一开始看到的时候就是一头雾水。。。心想是不是问错了,JVM???所以在今天总结一下,实现多线程的几个方法就先不说了。简介:java.util.concurrent 一个并发编程中经常用到的包,简称JUC,里面是一些多线程编程的实用工具类。1、volatile关键字1.1内存可见性 内存可见性指的是一个线...原创 2019-12-18 21:12:27 · 245 阅读 · 0 评论