![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程
心之所往、
有时候,相遇是缘份,亦是劫数。这世上,有命中注定,就有在劫难逃。当这两者出现在同一个人身上时,那个人既是你命中注定的缘分,亦是你躲不过的劫数。
展开
-
*java并发编程:1,线程基础-线程之间的共享和协作
学习路径:基础入门-》初步应用-》高级-》源码分析并发编程学习目录:1,线程基础、线程之间的共享和协作2,线程的并发工具类3,原子操作CAS4,显示锁和AQS5,并发容器6,线程池和Exector框架7,线程安全8a,实战项目-并发任务执行框架8b,实战项目-性能优化实战9,JMM和底层原理10,java8新增的并发*java并发编程-线程基础-线程之间的共享和协作(一)...原创 2020-03-13 23:46:37 · 211 阅读 · 0 评论 -
*java并发编程:3-原子操作CAS
*java并发编程:3-原子操作CAS1,CAS(Compare And Swap)什么是原子操作?如何实现原子操作?乐观锁JDK->CAS机制 --> 无锁化编程CAS的原理:利用了现代处理器都支持的CAS的指令,循环这个指令,直到成功为止。CAS的问题:ABA 问题开销问题只能保证一个共享变量的原子操作8.2 JDK中相关原子操作类的使用更新基本类型...原创 2020-04-07 20:33:00 · 159 阅读 · 0 评论 -
*java并发编程:2,线程的并发工具类
学习路径:基础入门-》初步应用-》高级-》源码分析并发编程学习目录:1,线程基础、线程之间的共享和协作2,线程的并发工具类3,原子操作CAS4,显示锁和AQS5,并发容器6,线程池和Exector框架7,线程安全8a,实战项目-并发任务执行框架8b,实战项目-性能优化实战9,JMM和底层原理10,java8新增的并发*java并发编程:2,线程的并发工具类1,Fork-...原创 2020-03-20 22:31:41 · 166 阅读 · 0 评论 -
java - 公平 和 非公平锁
java - 公平 和 非公平锁公平锁:是指多个线程按照申请锁的顺序来获取锁,类似排队打饭,先来后到。公平锁,就是很公平,在并发环境中,每个线程在获取锁是会先查看此锁的等待队列,如果为空,或者当前线程时等待队列的第一个,就占有锁,否则就会加到等待队列中,以后会按照 FIFO 的规则从队列中渠道自己。非公平锁: 是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线...原创 2020-03-08 23:13:56 · 84 阅读 · 0 评论 -
JUC-CAS
JUC-CASCAS 原理:AtomicInteger 的 getAndIncrement() 方法,底层使用的就是 CAS 的思想:通过 unsafe 方法实现this:当前对象valueOffset:当前对象内存地址1,从当前对象中取出当前值2,和内存地址中的期望值进行比较,如果值一样递增 1 ,如果不一样继续从当前对象中取出最新值和当前对象内存中的值进行比较,知道修改成功为...原创 2020-03-08 21:41:24 · 109 阅读 · 0 评论 -
JUC-CopyOnWriteArrayList
JUC-CopyOnWriteArrayListpackage com.test.thread.collect;import java.util.*;import java.util.concurrent.CopyOnWriteArrayList;/** * 1 故障现象: * java.util.ConcurrentModificationException * 2 ...原创 2020-03-08 21:40:22 · 187 阅读 · 0 评论 -
Java - 可重入锁(也叫递归锁)
Java - 可重入锁(也叫递归锁)指的是同一个线程 外层 函数获得锁之后,内层 递归函数仍然能够获取该锁的代码,在同一个线程在 外层方法 获取锁的时候,在进入 内层方法 会自动获取锁也即是说,线程可以进入任何一个它已经拥有的锁 所同步着的代码块。...原创 2020-03-08 21:39:19 · 150 阅读 · 0 评论 -
Java - 自旋锁(spinlock)
理论 – 代码 – 小总结Java - 自旋锁(spinlock)是指尝试获取锁的线程不会立即阻塞,而是采用 循环 的方式 尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是会消耗 CPU。例如:AtomicInteger 的 getAndIncrement() 方法中通过 Unsafe 的 compareAndSwapInt() 方法 类似自旋的方式private static ...原创 2020-03-08 21:38:51 · 263 阅读 · 0 评论 -
Java - 独占锁(写锁)/共享锁(读锁)/互斥锁
Java - 独占锁(写锁)/共享锁(读锁)/互斥锁独占锁(写锁):共享锁:多个线程同时读一个资源没有任何问题,所以为了满足并发量,读取共享资源应该可以同时进行。但是如果有一个线程想去写共享资源来,就不应该再由其他线程可以对该资源进行读或写小总结:读-读 能共存读-写 不能共存写-写 不能共存...原创 2020-03-08 21:38:13 · 441 阅读 · 0 评论 -
JUC - JMM 内存模型
JUC - JMM 内存模型JMM(Java内存模型Java Memory Model,简称JMM)本身是一种抽象的概念 并不真实存在,它描述的是一组规则或规范通过规范定制了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式.JMM关于同步规定:1.线程解锁前,必须把共享变量的值刷新回主内存2.线程加锁前,必须读取主内存的最新值到自己的工作内存3.加锁解锁是同一把锁...原创 2020-03-08 21:37:38 · 211 阅读 · 0 评论 -
JUC - Semaphore
JUC - Semaphore信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制。例子:抢车位package com.test.mianshi;import java.util.concurrent.Semaphore;import java.util.concurrent.TimeUnit;/** * Semaphore 与 CountDown...原创 2020-03-08 21:36:46 · 130 阅读 · 0 评论 -
JUC - CountDownLatch
JUC - CountDownLatchCountDownLatch countDownLatch = new CountDownLatch(SIX);当所有 “计数”线程都执行完之后,才可以执行后面的程序。每调用一次 countDownLatch.countDown(); 方法,减一。减到 0 时,才能执行 countDownLatch.await(); 方法之后的代码。CountDo...原创 2020-03-08 21:35:50 · 91 阅读 · 0 评论 -
JUC - CyclicBarrier
JUC - CyclicBarrierCyclicBarrier 的字面意思就是可循环(Cyclic)使用的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活,线程进入屏障通过 Cyclic 的 await() 方法。记忆便捷,集齐七颗龙珠才能召唤神龙。package com.t...原创 2020-03-08 21:35:31 · 91 阅读 · 0 评论 -
JUC - Lock 锁的多个条件Condition实现多线程调度及线程精确唤醒
JUC - Lock 锁的多个条件Condition实现线程精确唤醒题目:多个线程按顺序调用,实现A->B->C三个线程启动,要求如下:AA打印5次,BB打印10次,CC打印15次紧接着AA打印5次,BB打印10次,CC打印15次package com.test.mianshi.juc.生产者与消费者;import javax.swing.*;import java...原创 2020-03-08 21:35:09 · 365 阅读 · 1 评论 -
JUC -阻塞队列
JUC -阻塞队列ArrayBlockingQueue:是一个基于数组结构的有界阻塞队列,次队列按 FIFO(先进先出)原则对匀速进行排序。LinkedBlockingQueue:一个基于链表结构的阻塞队列,次队列按 FIFO(先进先出)排序元素,吞吐量通常要高于 ArrayBlockingQueue。SynchronousQueue:一个不存储元素的阻塞队列。每个插入操作必须等到另一个线...原创 2020-03-08 21:34:45 · 127 阅读 · 0 评论 -
JUC -线程池
JUC -线程池1,线程池的优势线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行。它的主要特点:线程复用控制最大并发数管理线程好处:第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗第二:提高响应速度。当任务到达...原创 2020-03-08 21:34:23 · 143 阅读 · 0 评论 -
多线程-线程池
多线程-线程池什么是线程池java 中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来 3 个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务达到时,任务不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程时稀缺资源,如果无限制地创建,不仅会消...原创 2020-03-08 21:33:03 · 76 阅读 · 0 评论 -
JUC - Synchronized 和 Lock 的区别
JUC - Synchronized 和 Lock 的区别面试题:Synchronized 和 Lock 有什么区别? 用新的 Lock 有什么好处?你举例说说。1,原始构成synchronized是关键字属于JVM层面,monitorenter 底层是通过 monitorenter 对象来完成,其实 wait/notify 等方法也依赖于 monitor 对象只有在同步块或方法中才能...原创 2020-03-08 21:05:40 · 474 阅读 · 0 评论 -
线程分批处理信息,list分割工具类
线程分批处理信息,list分割工具类package com.example.springbootdemo.utils;import java.util.ArrayList;import java.util.List;/** * 线程分批处理信息,list分割工具类 */public class ListUtils { public static <T> Li...原创 2020-03-08 21:31:23 · 100 阅读 · 0 评论 -
多线程分批处理消息
多线程分批处理消息-线程类package com.example.springbootdemo.thread.batch_send_sms;import java.util.List;/** * */public class UserSendThread implements Runnable{ private List<Integer> list; ...原创 2020-03-08 21:30:25 · 91 阅读 · 0 评论 -
多线程-java锁机制-乐观锁与悲观锁
多线程-java锁机制-乐观锁与悲观锁场景当多个请求同时操作数据库时,首先将订单状态改为已支付,在金额加上 200 ,再同时并发场景查询条件下,会造成重复通知(重读)。悲观锁定义:悲观锁悲观的认为每一次操作都会造成更新丢失问题,在每次查询时加上排他锁。每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会 block 直到它拿到锁。传统的关系型数据...原创 2020-03-08 21:27:53 · 96 阅读 · 0 评论 -
java锁机制-重入锁
java锁机制-重入锁定义锁作为并发共享数据,保证一致性的工具,在 java 平台有很多实现(如:synchronized 和 ReentrantLock 等)。这些已经提供的锁为我们开发提供了便利。重入锁,也叫递归锁,指的是同一个线程,外层函数获得锁之后,内层递归函数仍然有获取该锁的代码,但不受影响。即一个方法拿个锁之后在这个方法中调用了其他方法时,这个锁会传递给被调用的方法。代码示例...原创 2020-03-08 21:26:16 · 143 阅读 · 0 评论 -
java锁机制-读写锁
java锁机制-读写锁定义相比 java 中的锁(Locks in Java)里 Lock 实现,读写锁更复杂一些。假设你的程序中设计到对一些共享资源的读和写操作,且写操作没有读操作那么频繁。在没有写操作的时候,两个线程同时读一个资源没有任何问题,所以应该允许多个线程能在同时读取共享资源。但是如果有一个线程想去写这些共享资源,就不应该再由其他线程对资源进行读或写(即:读-读可以共存,读-写不能...原创 2020-03-08 21:25:29 · 118 阅读 · 0 评论 -
多线程-并发包-lock 锁
并发包-lock 锁lock 接口与 synchronized 关键字的区别Lock 接口可以尝试非阻塞地获取锁,当前线程尝试获取锁。如果这一时刻锁没有被其他线程获取到,则成功获取并持有锁。Lock 接口能被中断地获取锁 与 synchronized 不同,获取到锁的线程能够响应中断,当获取到的锁的线程被中断时,中断异常将会被抛出,同时锁会被释放。Lock 接口在指定的截止时间之前获取锁,...原创 2020-03-08 21:23:53 · 88 阅读 · 0 评论 -
多线程-并发包-CyclicBarrier
多线程-并发包-CyclicBarrierCyclicBarrier 初始化时规定一个数目,然后计算调用 CyclicBarrier.await() 进入等待的线程数。当线程数达到了这个数目时,所有进入等待状态的线程被唤醒并继续。CyclicBarrier 就像它的名字的意思一样,可看成是个障碍,所有的线程必须到齐后才能一起通过这个障碍。CyclicBarrier 初始时还可带一个 Runn...原创 2020-03-08 21:23:24 · 91 阅读 · 0 评论 -
多线程-并发包-CountDownLatch
多线程-并发包-CountDownLatchCountDownLatch 类位于 java.util.concurrent 包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他 4 个任务执行完毕之后才能执行,此时就可以利用 CountDownLatch 来实现这个功能。代码示例: package com.test.thread.countdownlatch;import...原创 2020-03-08 21:22:14 · 139 阅读 · 0 评论 -
多线程-并发包-Semaphore(信号量)
多线程-并发包-Semaphore(信号量)Semaphore 是一种基于计数的信号量。它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞。Semaphore 可以用来构建一些对象池,资源池之类的,比如数据库连接池,我们也可以创建技术为 1 的 Semaphore,将其作为一种类似互斥锁的机制,这也叫二元信号量,表示两种互斥状态。它...原创 2020-03-08 21:21:35 · 101 阅读 · 0 评论 -
多线程-并发包-队列
多线程-并发包-队列有界、无界;阻塞队列、非阻塞队列ConcurrentLinkedDeque是一个适合用于高并发场景下的队列,通过无锁的方式,实现了高并发状态下的高性能,通常 ConcurrentLinkedQueue 性能好于 BlockingQueue。它是一个基于链接节点的 无界线程安全队列。该队列的元素遵循先进先出的原则。头是最先加入的,尾是最近加入的,该队列不允许 null 元素...原创 2020-03-08 21:20:12 · 89 阅读 · 0 评论 -
多线程-ThreadLocal
多线程-ThreadLoca什么是 Threadloca?为每一个线程提供一个局部变量,主内存中的数据不再进行共享。代码示例:package com.test.thread.threadloca;/** * 底层原理: * map 集合 + 当前线程 * set 方法底层实现 * get 方法实现 */public class ThreadLocaDemo ...原创 2020-03-08 21:15:42 · 106 阅读 · 0 评论 -
JUC- volatile
JUC- volatile理论,代码,总结。1,线程可见性线程可见性代码验证:未添加 volatile 关键字之前package com.test.thread.volatile_;import java.util.concurrent.TimeUnit;public class VolatileDemo { public static void main(Str...原创 2020-03-08 21:12:35 · 110 阅读 · 0 评论 -
JUC - Callable 接口
JUC - Callable 接口Thread 和 Runnable 是在JDK1.0 就已经存在的类,Thread的构造方法也是传Runnable,而Callable是JDK1.5才出现的,所以这里使用了适配器模式,通过中间的类 FutureTask 来进行功能扩展尽量把 获取结果的futureTask.get(); 方法往后面放,否则 Callable 接口的代码没有执行完,会造成阻塞。...原创 2020-03-08 21:12:09 · 209 阅读 · 0 评论 -
JUC - 线程池你用过吗?生产上你如何设置合理参数
JUC - 线程池你用过吗?生产上你如何设置合理参数1,你谈谈线程池的拒绝策略1.1是什么?等待队列也已经满了,再也塞不下新任务了同时,线程池中的max线程也达到了,无法继续新任务服务。这时候我们就需要拒绝策略机制合理的处理这个问题。1.2 JDK内置的拒绝策略AbortPolicy(默认)直接抛出 RejectedExecutionException 异常阻止系统正常运行。...原创 2020-03-08 21:11:29 · 233 阅读 · 0 评论 -
JUC -死锁编码及定位分析
JUC -死锁编码及定位分析1,是什么1.1 是什么:死锁 是指两个 或 两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉那它们都将无法推进下去,如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性很低,否则就会因争抢有限的资源而陷入死锁。1.2 产生死锁的主要原因1,系统资源不足2,进程运行推进的顺序不合适3,资源分配不当2,代码死锁...原创 2020-03-08 21:10:09 · 121 阅读 · 0 评论