![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
并发编程
文章平均质量分 91
多线程
学nm个锤子
Qtmd
展开
-
11-线程池原理分析
一,线程池的基本使用1,线程池的介绍线程复用,控制最大并发数,管理线程。优点:提高响应速度,避免每次都去创建线程。便于管理,降低资源消耗。2,常用的线程池1.Executors.newFixedThreadPool();执行长期任务性能好,创建一个线程池,一池有N个固定的线程,有固定的线程数的线程2.Executors.newSingleThreadExecutor();一个任务一个任务的执行,一池一线程3.Executors.newCachedThreadPool();执行很多短期异原创 2021-02-19 21:29:33 · 350 阅读 · 0 评论 -
15-读写锁底层原理
一,线程间通信1.两个线程交替打印题目:i=0,a:i++,b:i--,交替打印10次1)使用synchronizedpublic class JUCNote3 { /** * i=0 * a:i++ * b:i- * 交替10次 */ public static void main(String[] args) { Share share = new Share(); new Thread(() -原创 2021-02-17 20:19:36 · 729 阅读 · 0 评论 -
1-并发编程的基本认识
一,并发的发展历史真空管和穿孔打卡操作员在机房里面来回调度资源,以及计算机同一个时刻只能运行一个程序,在程序输入的过程中,计算机的计算和处理空闲状态 。而当时的计算机是非常昂贵的,人们为了减少这种资源的浪费。就采用了 批处理系统来解决。晶体管和批处理系统批处理操作系统虽然能够解决计算机的空闲问题,但是当某一个作业因为等待磁盘或者其他 I/O 操作而暂停时,那CPU 就只能阻塞直到该 I/O 完成,对于 CPU 操作密集型的程序,I/O 操作相对较少,因此浪费的时间也很少。但是对于 I/O 操作较多的原创 2021-02-17 19:29:02 · 214 阅读 · 0 评论 -
12-ThreadLocal源码分析
一,ThreadLocal的基本使用与原理为线程创建独一份的副本数据。1,基本使用/** * @author yhd * @createtime 2021/2/17 11:31 */public class TheadLocalDemo { private static final AtomicInteger nextId = new AtomicInteger(0); private static final ThreadLocal<Integer> thre原创 2021-02-17 14:20:11 · 126 阅读 · 0 评论 -
13-FutureTask
一,Thread和Runnable1.Thread类是如何开启一个新的线程的 public synchronized void start() { if (threadStatus != 0) throw new IllegalThreadStateException(); group.add(this); boolean started = false; try {原创 2020-10-04 19:48:08 · 243 阅读 · 0 评论 -
14-CompletableFuture异步编排
一,前置知识1,用户线程和守护线程1.所有用户线程执行完毕,程序就会退出,不再等待守护线程。 public static void main(String[] args) { new Thread(()-> System.out.println("当前线程"+Thread.currentThread().getName()+"是"+(Thread.currentThread().isDaemon()?"守护线程":"用户线程"))).start(); }2.用户线程原创 2020-11-16 15:03:55 · 309 阅读 · 0 评论 -
10-concurrentHashMap
一,ConcurrentHashMap 的初步使用及场景1,CHM 的使用ConcurrentHashMap 是 J.U.C 包里面提供的一个线程安全并且高效的 HashMap,所以ConcurrentHashMap 在并发编程的场景中使用的频率比较高。ConcurrentHashMap 是 Map 的派生类,所以 api 基本和 Hashmap 是类似,主要就是 put、get 这些方法,接下来基于 ConcurrentHashMap 的 put 和 get 这两个方法作为切入点来分析 Concu原创 2021-02-16 13:08:44 · 215 阅读 · 0 评论 -
5-并发编程之LongAdder
一,LongAdder和AtomicInteger效率对比/** * @author yhd * @createtime 2020/10/3 22:35 * 比较LongAdder和AtomicInteger的效率 */public class LongAdderAndAtomicTest { public static void main(String[] args) throws Exception { test(1, 10000000); te原创 2020-10-04 11:50:58 · 250 阅读 · 2 评论 -
9-阻塞队列&原子操作的原理分析
把多线程环境比作是分布式的话,那么线程与线程之间是不是也可以使用这种消息队列的方式进行数据通信和解耦呢?一,阻塞队列的使用案例1,注册成功后增加积分假如模拟一个场景,就是用户注册的时候,在注册成功以后发放积分。这个场景在一般来说,会这么去实现:但是实际上,我们需要考虑两个问题:1,性能,在注册这个环节里面,假如添加用户需要花费 1 秒钟,增加积分需要花费 1 秒钟,那么整个注册结果的返回就可能需要大于 2 秒,虽然影响不是很大,但是在量比较大的时候,我们也需要做一些优化。2,耦合,添加用户和增原创 2021-02-16 02:15:45 · 317 阅读 · 1 评论 -
6-并发编程之LockSupport
一.可重入锁可重入锁又名递归锁是指在同一个线程在外层方法获取锁的时候,再进去该线程的内层方法会自动获取锁(前提:同一个锁对象),不会因为之前已经获取过还没释放而阻塞。java中的reentrantLock和Synchronized都是可重入锁,可重入锁的一个优点是可一定程度避免死锁。public class Demo2 { private static Object lock = new Object(); public static void main(String[] arg原创 2020-11-12 00:26:21 · 88 阅读 · 0 评论 -
4-并发编程之CAS
一,问题引入1.需求模拟网站访问量统计,假设现在有100个用户,每个人访问10次。/** * @author yhd * @createtime 2020/10/3 19:05 * @description 模拟网站访问量统计 * 假设现在有100个用户,每个人访问10次。 */public class DemoA { /** * 模拟用户访问 */ public static int count = 0; public static void原创 2020-10-03 22:02:04 · 542 阅读 · 4 评论 -
8-并发工具的使用及原理
一,ConditionCondition 是一个多线程协调通信的工具类,可以让某些线程一起等待某个条件(condition),只有满足条件时,线程才会被唤醒。1,Condition 的基本使用1)ConditionWaitpublic class ConditionDemoWait implements Runnable { private Lock lock; private Condition condition; public ConditionDemoWait原创 2021-02-15 21:46:37 · 189 阅读 · 1 评论 -
7-ReentrantLock底层原理分析
一,LockLock 在 J.U.C 中是最核心的组件。1,Lock实现Lock 本质上是一个接口,它定义了释放锁和获得锁的抽象方法,定义成接口就意味着它定义了锁的一个标准规范,也同时意味着锁的不同实现。实现 Lock 接口的类有很多,以下为几个常见的锁实现。ReentrantLock:表示重入锁,它是唯一一个实现了 Lock 接口的类。重入锁指的是线程在获得锁之后,再次获取该锁不需要阻塞,而是直接关联一次计数器增加重入次数。ReentrantReadWriteLock:重入读写锁,它实现了 Re原创 2021-02-15 17:33:43 · 6962 阅读 · 3 评论 -
3-volatile&JMM
一,初步认识 Volatile1,一段代码引发的思考下面这段代码,演示了一个使用 volatile 以及没使用volatile 这个关键字,对于变量更新的影响public class VolatileTest { public volatile static boolean stop = false; public static void main(String[] args)throws InterruptedException { Thread thread =原创 2021-02-15 11:17:51 · 204 阅读 · 0 评论 -
2-synchronized
一,由一个问题引发的思考线程的合理使用能够提升程序的处理性能,主要有两个方面,第一个是能够利用多核 cpu 以及超线程技术来实现线程的并行执行;第二个是线程的异步化执行相比于同步执行来说,异步执行能够很好的优化程序的处理性能提升并发吞吐量。1,线程安全一个变量 i. 假如一个线程去访问这个变量进行修改,这个时候对于数据的修改和访问没有任何问题。但是如果多个线程对于这同一个变量进行修改,就会存在一个数据安全性问题。一个对象是否是线程安全的,取决于它是否会被多个线程访问,以及程序中是如何去使用这个对象原创 2021-02-15 01:00:09 · 289 阅读 · 1 评论