
多线程
ccddsdsdfsdf
这个作者很懒,什么都没留下…
展开
-
用jdk8新特性CompletableFuture实现高并发接口设计
前言系统A调用系统B接口会被频繁多次调用,一次过来1000请求,那么意味着会调用B系统1000次,这样调用会大大降低接口效率,那么如何批量调用这个接口,同时能让返回结果对应与每个请求线程一 一对应一、高并发接口设计1、通常调用通常单条请求调用如下:public Map<String,Object> queryOrderInfo(String code){ Map<...原创 2020-02-28 14:44:25 · 2230 阅读 · 4 评论 -
jdk1.8对cas操作优化
一、前言假设现在有多个线程对一个变量不停累加,如果直接对这个变量做 ++ 操作,是有问题的。多线程对一个data变量时空行修改,是线程不安全的,会导致data值的变化不遵循预期的值来改变。二、初初步解决:synchronized对方法上加synchronized关键字,这样初步的解决“太重了”。更高效解决方案:Atomic原子类及其底层原理java并发包下提供了一系列Atomic原子...原创 2020-02-26 17:16:29 · 1225 阅读 · 0 评论 -
17-并发容器之ConcurrentSkipListMap
TreeMap,TreeSet 有序容器,的并发版ConcurrentSkipListMapSkipList,以空间换时间,在原链表的基础上形成多层索引,但是某个节点在插入时,是否成为索引,随机决定,所以跳表又称为概率数据结构。如果redis sortedmap和luence就是通过跳表实现的1、定时复制容器添加元素时不直接向里面添中元素,而是根根原容易复制出一个新容器,然后向新容器中添加...原创 2020-02-16 18:46:29 · 366 阅读 · 0 评论 -
18-并发容器应用之线程池
一、前言我们知道了只个并发容器之后,那么看我们线程池 也是基于并发容器实现的为什么要有线程池:1、避免线程频繁的创建和销毁,浪费资源2、提高响应速度,需要获取线程的直接去线程池中获取,不用创建,也节约了需要销毁线程时间3、便于统一管理:线程可以放到线程池里面统一管理二、实现线程池的几个要点1、需要提前创建好,并可以保持2、可以向线程池提交任务,并有执行任务的能务3、可以接收来不及...原创 2020-02-14 19:56:29 · 194 阅读 · 0 评论 -
16-并发容器之ConcurrentHashMap
一、hashMaphashMap是线程不安全的,为什么线程不安全,hashMap每个元素都是一个链表结构,在多线程put插作时可以会形成回路链表,导致遍历链表的时候会键入死循环hashTalbe是线程安全的,但hashTable put get插作时都会对整张table组数加锁,效率比较低。并且在扩容的时候会将整个table元素遍历重新定位,复制给新的table二、ConcurrentHas...原创 2019-10-18 19:50:10 · 424 阅读 · 0 评论 -
14-并发类AQS
一、什么是AQSAQS:是一个抽象类,java所有显示锁比如(ReentrantLock)都是通过个类实现的。二、AQS类数据结构AQS抽象类:采用了模版方法模式,这个类里面定义了一系列模准流程的模版方法,只要子类(比如ReentrantLock)继承这个模版类,并重写流程方法,那到就可以实现锁。AQS中定义的模版方法:1、acquire(int arg)//独占式-获取锁方法2、ac...原创 2019-10-17 00:52:15 · 225 阅读 · 0 评论 -
14-Lock.condition,signal,await(实现等待通知)
一个锁可对应多个condition,可以根据不同condition进行通知原创 2019-10-19 23:33:23 · 160 阅读 · 0 评论 -
15-并发类AQS之读写锁ReentrantReadWriteLock实现
ReentrantReadWriteLock介绍ReentrantReadWriteLock是读写锁,它维护了一对相关的锁读取锁和写入锁,一个用于读操作,另一个用于写操作 读取锁:用于只读操作,这它是“共享锁“,能同时被多个线程获取. 写入锁:用于写入操作,它是“独占锁”,写入锁只能被一个线程锁获取。原创 2017-09-05 17:25:26 · 311 阅读 · 0 评论 -
12-Lock显示锁(排它锁)
前言不太擅长记录原理类东西,但另一方面这些理论确实比较重要,只有掌握了这些东西,在出现问题的时候才能更好的解决.一、ReentrantLock涉及到几个概念1、什么是AQS:AQS即是AbstractQueuedSynchronize抽象类AQS是java中管理“锁”的抽象类,锁的许多公共方法都是在这个类中实现。AQS是独占锁(例如,ReentrantLock)和共享锁(例...原创 2017-09-05 17:21:52 · 397 阅读 · 0 评论 -
12-原子操作CAS
一、cas简介java.util.concurrent包完全建立在CAS之上的,没有CAS就不会有此包java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁。二、cas原理CAS:Compare and Swap 比较并交换 CAS有三个参数,内存位置V、旧的预期值A、新的预期值B。当且仅当V符合预期值A的时候,CAS用新值B原...原创 2018-03-30 14:50:01 · 1236 阅读 · 0 评论 -
11-并发工具类Semaphore,callable
Semaphore信号量,用于流量控制,同时允计N个线程获访问同时允许3个线程去竞争打印机:public class PrintQueue { private boolean freePrinters[]; private Lock lockPrinters; //2. 声明一个对象为Semaphore,称它为semaphore。 private fina...原创 2019-10-16 13:06:30 · 202 阅读 · 0 评论 -
10-并发工具类cyclicBarrier
一、cyclicBarrier简介CyclicBarrier允许N个线程相互等待。 基本使用//启动主方法public static void main(String[] args){ final int ROWS=10000; final int NUMBERS=1000; final int SEARCH=5; ...原创 2017-09-05 17:26:49 · 262 阅读 · 0 评论 -
9-并发工具类CountDownLatch-增强版的join
一、CountDownLatch简介CountDownLatch是同步工具类之一,可以指定一个计数值,在并发环境下由线程进行减1操作,当计数值变为0之后,被await方法阻塞的线程将会唤醒,实现线程间的同步。 CountDownLatch和CyclicBarrier的区别 (01) CountDownLatch的作用是允许1或N个线程等待其他线程完成执行;而CyclicBarrier则是允原创 2017-09-05 17:23:37 · 245 阅读 · 0 评论 -
8-并发工具类Fork-Join
一、概念fork-join 体现“分而治之”思想将一个大任务分成N个子线程去处理,处理完成后将结果join合并一个大任务分成2个线程AB执行,每个线程执行5个任务,当线程A执行完后,发现线程B的任务没执行完,那么线程A会去获取B的任务执行完并把结果返回到B中,这个情况要窃取,提高的线程执行效率,不会使行线程A执行完任务后而空转二、使用标准使用标准范式:pool = new Forkjo...原创 2019-10-19 23:33:52 · 160 阅读 · 0 评论 -
7-线程间通信-等待/通知机制wati(),notify()及其它线程操作join,yield,sleep()
一、join将子线程合并到主线程中比如在主线程中启了一个线程A,在main方法调用a.join(),那么main线程必须要等线程A执行完成后,才能继续向下执行。或在线程A中执行线程B的join方法,那么必须等线程B执行完后,线程A才会继续向下执行二、yield,sleep(),wati(),notify()对锁的影响调用yield(): 让出cpu,由cpu决定要执行哪个线程,但这个线程...原创 2019-12-24 17:55:45 · 464 阅读 · 0 评论 -
6-线程协作wait,notify,notifyall(实现等待通知)
前言共享数据修改,是通过sync volatile threadlocal 等实现当一个线程的值修改,那么另一个线程需要感知这个线程的修改 :即使线程通讯,那么就需要线程协作1、用轮询,隔15分钟去查看a 很难确保及时性b 开销大,要一直去查看 浪费很多时间做无用功2、设置一个闹钟,每次还是需要看查看闹钟3、等待 通知机制wait() notify() notifyAll(); ...原创 2019-10-19 23:33:41 · 196 阅读 · 0 评论 -
4-线程共享ThreadLocal
1、ThreadLocalThreadLocal是一个数据结构,有点类似hashMap,也是Key-value形式,但是ThreadLocal只能保存一个,并保证每个线程互不干扰。ThreadLocal&amp;lt;String&amp;gt; threadLocal = new ThreadLocal&amp;lt;&amp;gt;();threadLocal.set(&quot;test&qu原创 2018-03-23 15:28:38 · 310 阅读 · 0 评论 -
3-线程共享volatile
一.内存模型的相关概念cpu从内存读取数据的速度跟不上cpu执行的速度,所以cpu中有了高速缓存。当程序在运行时,会将运算需要的数据从主存复制一份到cpu的高速缓存,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据, 当运算结束之后,再将高速缓存中的数据刷新到主存当中。在单线程中是没有问题,但到多线程环境下可能就会出现缓存不一致性的问题. 如何解决缓存不一致性问题,通常...原创 2018-03-30 14:51:08 · 230 阅读 · 0 评论 -
2-线程共享synchronized(内置锁、隐式锁)关键字的用法
1、synchronized的三种应用方式修饰实例方法作用于当前实例加锁,进入同步代码前要获得当前实例的锁修饰静态方法作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁修饰代码块指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。...原创 2019-01-24 14:33:43 · 466 阅读 · 0 评论 -
1-并发编程概念
一、基础cup核心数据与线程数 早期是1:1关系但后internet优化,提一核可以同时处理2个线程,所以现在核心数据与线程 1:2cpu时间片轮询机制,cpu在执行任务的时候是把cpu分成一段段时间片,因为时间片太短我们感知不到并发和并行:并行:同一时刻处理事情的能力如比:食堂有8个打饭窗口,那么可以同时处理8个人打饭并发:时间段内处理事情的能力如比:一个人找饭需1分钟,那么食堂...原创 2020-01-27 14:19:52 · 178 阅读 · 0 评论