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