Thread
择业
努力学习技术
展开
-
线程安全——AQS——锁优化
1 避免死锁2 减小锁的持有时间3 减小锁的粒度4 锁的分离(读写锁)5 尽量使用无锁的操作,如原子操作(Atomic系列类),volatile关键字源代码解析:acquire(int): 此方法是独占模式下线程获取共享资源的顶层入口。如果获取到资源,线程直接返回,否则进入等待队列,直到获取到资源为止,且整个过程忽略中断的影响。这也正是lock()的语义,当然不仅仅只限于lock()。获取到资源后,线程就可以去执行其临界区代码了。下面是acquire()的源码,也是AQS的核心.原创 2021-08-26 16:36:32 · 126 阅读 · 0 评论 -
线程安全——AQS——LockSupport针对一个线程的阻塞与释放阻塞
LockSupport提供park()和unpark()方法实现阻塞线程和解除线程阻塞,实现的阻塞和解除阻塞是基于”许可(permit)”作为关联,permit相当于一个信号量(0,1),默认是0. 线程之间不再需要一个Object或者其它变量来存储状态,不再需要关心对方的状态。LockSupport不需要在同步代码块里 。所以线程间也不需要维护一个共享的同步对象了,实现了线程间的解耦.unpark函数可以先于park调用,所以不需要担心线程间的执行...原创 2021-08-26 15:38:29 · 256 阅读 · 0 评论 -
线程安全——AQS——ReadWriteLock读写锁的使用
读写锁ReentrantReadWriteLock,其核心就是实现读写分离的锁。在高并发访问下,尤其是读多写少的情况下,性能要远高于重入锁。 之前学synchronized、ReentrantLock时,我们知道,同一时间内,只能有一个线程进行访问被锁定的代码,那么读写锁则不同,其本质是分成两个锁,即读锁、写锁。在读锁下,多个线程可以并发的进行访问,但是在写锁的时候,只能一个一个的顺序访问。 口诀:读读共享,写写互斥,读写互斥。代码:private Reentra...原创 2021-08-26 14:53:26 · 339 阅读 · 0 评论 -
线程安全——AQS——(CountDownLatch)与Condition条件判断的使用多个线程中等待唤醒操作
再以CountDownLatch以例,任务分为N个子线程去执行,state也初始化为N(注意N要与线程个数一致)。这N个子线程是并行执行的,每个子线程执行完后countDown()一次,state会CAS减1。等到所有子线程都执行完后(即state=0),会unpark()调用线程,然后主调用线程就会从await()函数返回,继续后余动作。package com.bfxy.thread.core.juc;import java.util.concurrent.CountDownLa...原创 2021-08-26 14:01:45 · 296 阅读 · 0 评论 -
线程安全——AQS——ReentrantLock(重入锁)
A线程自己是可以重复获取此锁的(state会累加),这就是可重入的概念。但要注意,获取多少次就要释放多么次,这样才能保证state是能回到零态的。谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer (AQS) 类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,比如我们之前的课程上讲到的: 的ReentrantLo...原创 2021-08-26 11:49:06 · 234 阅读 · 0 评论 -
linux基本命令-
tail显示文件file.txt的最后10行tail file.txt显示文件file.txt最后20行tail +20 file.txt显示文件file的最后10个字符tail -c 10 file.txt一直变化的文件总是显示后10行tail -f 10 file.txt显示帮助信息tail --helpzip命令 – 压缩文件...原创 2021-08-18 18:34:35 · 120 阅读 · 0 评论 -
线程安全——线程池核心——ThreadPoolExecutor自定义线程池
若Executors工厂无法满足我们的需求,可以自己创建自定义线程池,其实Executors工厂类里面的创建线程方法其内部实现均是用了ThreadPoolExecutor这个类,这个类可以自定义线程。构造方法如下:队列类型参数选择:在使用有界队列时,若有新的任务需要执行,如果线程池实际线程数小于corePoolSize,则优先创建线程,若大于corePoolSize,则会将任务加入队列,若队列已满,则在总线程数不大于maximumPoolSize的前提下,创建新...原创 2021-08-18 17:59:27 · 687 阅读 · 0 评论 -
线程安全——线程池核心——Executors线程工厂类
线程池核心概述Executors工厂类使用 Executors工厂类底层源码分析详解 ThreadPoolExecutor自定义线程池 ThreadPoolExecutor拒绝策略详解 计算机密集型与IO密集型详解 如何正确的使用线程池线程池一说到这个词,大家很容易想到高并发等等各种脑补的场景。高并发其实是一个非常抽象的概念,要实现高并发其实不仅仅是一个JAVA 线程集合类、或者JAVA基础层面就能搞定的事情,在互联网大厂中,高并发...原创 2021-08-17 16:28:44 · 476 阅读 · 0 评论 -
线程安全——J.U.C工具类——Semaphore信号量与限流策略(只支持五个线程执行企业他排队)
Semaphore信号量与限流策略在Semaphore信号量非常适合高并发访问限制,新系统在上线之前,要对系统的访问量进行评估,当然这个值肯定不是随便拍拍脑袋就能想出来的,是经过以往的经验、数据、历年的访问量,已经推广力度进行一个合理的评估,当然评估标准不能太大也不能太小,太大的话投入的资源达不到实际效果,纯粹浪费资源,太小的话,某个时间点一个高峰值的访问量上来直接可以压垮系统。相关概念:PV(page view)网站的总访问量,页面浏览量或点击量,用户每刷新一次就会被记录一次。...原创 2021-08-17 12:02:24 · 181 阅读 · 0 评论 -
线程安全——Master-Worker并发组件设计模拟
Master-Worker并发组件设计模拟Master-Worker模式是常用的并行计算模式。它的核心思想是系统由两类进程协作工作:Master进程和Worker进程。Master负责接收和分配任务,Worker负责处理子任务。当各个Worker子进程处理完成后,会将结果返回给Master,由Master做归纳和总结。其好处是能将一个大任务分解成若干个小任务,并行执行,从而提高系统的吞吐量。代码结构;代码实现:执行的任务package com.bfxy.t...原创 2021-08-13 15:29:49 · 144 阅读 · 0 评论 -
线程安全——J.U.C工具类——ForkJoin并行框架
ForkJoin并行框架Fork/Join框架是JAVA7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架使用场景:不需要返回结果:将100条数据插入到数据库Fork/Join中两个重要的类:ForkJoinTask:使用该框架,需要创建一个ForkJoin任务,它提供在任务中执行fork和join操作的机制。一般情况下,我们并不需要直接继承ForkJoinTask类,只需要继承它的子类,它的子类有两个:Recu.原创 2021-08-13 11:53:01 · 258 阅读 · 0 评论 -
线程安全——J.U.C工具类——Exchanger两个线程间数据交换,比如应用在数据比对
Exchanger多线程间数据交换Exchanger用于进行线程间的数据交换,它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据;两个线程通过exchange方法交换数据,如果一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange方法当两个线程都达到同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方 使用场景:两人录入excle比较数据是否一样遗传算法:遗传算法里需要选出两个人作为交换对象,这时会交换两人的数据,并使用..原创 2021-08-12 18:47:59 · 155 阅读 · 0 评论 -
线程安全——J.U.C工具类——Future(异步空间换时间)与实现Caller回调(适合业务耗时比较长)(模拟future)
Future模式,也是非常经典的设计模式,这种模式主要就利用空间换时间的概念,也就是说异步执行(需要开启一个新的线程)。在互联网高并发的应用服务中,我们随处可见这种理念和代码,主要就是使用了这种模式!Future模式非常适合在处理很耗时很长的业务逻辑时进行使用,可以有效的减小系统的响应时间,提高系统的吞吐量!1/实现Callable接口2/3/4/package com.bfxy.thread.core.juc;import java.util.concurrent.Cal原创 2021-08-10 18:38:17 · 267 阅读 · 0 评论 -
线程安全——J.U.C工具类——CyclicBarrier(阻塞多个线程后,同时开启执行)实例:模拟几个运动员同时跑步
CyclicBarrier:栅栏的概念,多线程的进行阻塞,等待某一个临界值条件满足后,同时执行! 假设有只有的一个场景:每个线程代表一个跑步运动员,当运动员都准备好后,才一起出发,只要有一个人没有准备好,大家都等待!package com.bfxy.thread.core.juc;import java.util.Random;import java.util.concurrent.BrokenBarrierException;import java.util.concur...原创 2021-08-10 17:25:14 · 191 阅读 · 0 评论 -
线程安全——J.U.C工具类——CountDownLatch
概述:CountDownLatch CountDownLatch实战场景应用 CyclicBarrier CyclicBarrier实战场景应用 Future与Caller回调利用设计模式模拟FutureExchanger多线程间数据交换ForkJoin并行Master-Worker并发组件模拟-生产消费者模式 Semaphore信号量与限流策略 CountDownLatch用于监听某些初始化操作,并且线程进行阻塞,等初始化执行...原创 2021-08-10 16:29:15 · 472 阅读 · 0 评论 -
线程安全——JDK Unsafe类使用(内存操作,字段定位与修改等)与CAS原子特性
java.util.concurrent.atomic包,其中大量的用到Unsafe这个类。那么我们就了解一下这个类到底是来干嘛的?由于java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作,主要提供了以下功能:内存操作字段的定位与修改挂起与恢复CAS操作(乐观锁) 字段的定位与修改:可以定位对象某字段的内存位置也可以修改对象的字段值,即使它是私有的挂起与恢复将一个线程进行挂起是通过park方法实现的,调用 park后,线程将一直阻塞直到超时.原创 2021-08-10 14:51:14 · 387 阅读 · 0 评论 -
线程安全——Atomic系列类(主要实现原子类)
Atomic系列类封装了一系列的基础类型和对象操作,其主要目的就是为了实现原子性,主要核心类如下:AtomicIntegerAtomicLongAtomicBooleanAtomicIntegerArrayAtomicLongArrayAtomicReference原子性,多线程中能并发操作,保证数据准确AtomicInteger与synchronized(将add操作变成一个原子操作)能保证原子性操作,(最终结果1000)能保证方法内运行中不会出现617,613之类的数原创 2021-08-09 18:13:35 · 496 阅读 · 0 评论 -
线程安全——volatile&Happensbefore与指令重排序的概念
Hello 大家好,我原名叫Java Memory Model(Java 内存模型),大家都叫我JMM,简洁又好听!并发编程这块,没有我可是不行的,我要解决的问题就是一个线程对共享变量的写入何时对另一个线程可见!比如一个线程给变量 a 赋值 int a = 3; // 向变量 a 写值我要解决的问题就是:"在什么条件下,读取变量a的线程将看到这个值3"如果缺少同步,那会有很多因素使得读取变量a的线程不能立即看到或者永远看不到这个值3...原创 2021-08-09 17:21:53 · 146 阅读 · 0 评论 -
线程安全——Volatile&原子性、核心
Volatile&原子性、核心概述Volatile关键字核心概念与应用 Volatile关键字内存模型分析 Volatile关键字happens-before与内存屏障概念、重排序 Atomic类关键字 Atomic类实战应用爬坑手记 JDK Unsafe类使用与CAS原子特性Volatile概念:Volatile关键字的主要作用是使变量在多个线程间可见。作用: 在多线程间可以进行变量的变更,使得线程间进行数据的共享可见原创 2021-08-07 17:38:56 · 101 阅读 · 0 评论 -
线程安全——线程经典面试Synchronized/CountDownLatch/volatile
Synchronized(同步)同步:synchronized 同步的概念就是共享,我们要牢牢记住"共享"这俩个字,如果不是共享的资源,就没有必要进行同步。异步:asynchronized(伪代码不是JDK代码) 异步的概念就是独立,相互之间不受到任何制约。就好像我们学习http的时候,在页面发起的Ajax请求,我们还可以继续浏览或操作页面的内容,二者之间没有任何关系。 同步的目的就是为了线程安全,其实对于线程安全来说,需要满足俩个特性: 原子性(同步)原创 2021-08-07 17:03:31 · 413 阅读 · 0 评论 -
线程安全——ThreadLoacl(用空间换时间,避免高并发下加锁)
不加锁,用空间换时间:(在一定情况下减少锁竞争) 线程局部变量,是一种多线程间并发访问变量的解决方案。与其synchronized等加锁的方式不同,ThreadLocal完全不提供锁,而使用以空间换时间的手段,为每个线程提供变量的独立副本,以保障线程安全。 从性能上说,ThreadLocal不具有绝对的优势,在并发不是很高的时候,加锁的性能会更好,但作为一套与锁完全无关的线程安全解决方案,在高并发量或者竞争激烈的场景,使用ThreadLocal可以在一定程度上减少锁竞争T.原创 2021-08-07 14:34:18 · 527 阅读 · 0 评论 -
线程安全——synchronized
基本概念: 线程安全概念:当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的。 synchronized:可以在任意对象及方法上加锁,而加锁的这段代码称为“互斥区”或“临界区”。 当多个线程访问myThread的run方法时,以排队的方式进行处理(这里排对是按照CPU分配的先后顺序而定的),一个线程想要执行synchronized修饰的方法里的代码,首先是尝试获得锁,如果拿到锁,执行synchronized代码体原创 2021-08-07 12:47:11 · 482 阅读 · 0 评论 -
多线程——DelayQueue(带有延迟时间的无界Queue)控制网吧网民下机
DelayQueue:带有延迟时间的Queue其中的元素只有当其指定的延迟时间到了,才能够从队列中获取到该元素。DelayQueue中的元素必须实现Delayed接口,DelayQueue是一个没有大小限制的队列,应用场景很多,比如对缓存超时的数据进行移除、 任务超时处理、空闲连接的关闭等等代母逻辑:WangBa (网吧实现Runnable),其中网吧里面有private DelayQueue<WangMin> delayQeueu = new DelayQueue<.原创 2021-08-05 11:38:51 · 248 阅读 · 0 评论 -
多线程——优先级阻塞队列——PriorityBlockingQueue
PriorityBlockingQueue基于优先级的阻塞队列优先级的判断通过构造函数传入的Compator对象来决定,也就是说传入队列的对象必须实现Comparable接口,在实现PriorityBlockingQueue时,内部控制线程同步的锁采用的是公平锁,他也是一个无界的队列按照自己定义的顺序进行执行队列,不是按照现后顺序进行的PriorityBlockingQueue传的是自定义的对象,如Node类(实现了排序)package com.bfxy.thread.core.co.原创 2021-08-05 11:01:38 · 514 阅读 · 0 评论 -
多线程——BlockingQueue的实现ConcurrentLinkedQueue/ArrayBlockingQueue/LinkedBlockingQueue/SynchronousQueue
接口实现组织如上图ArrayBlockingQueue(有界阻塞队列)ArrayBlockingQueue: 基于数组的阻塞队列实现在ArrayBlockingQueue内部,维护了一个定长数组,以便缓存队列中的数据对象,其内部没实现读写分离,也就意味着生产和消费不能完全并行,长度是需要定义的,可以指定先进先出或者先进后出,也叫有界队列,在很多场合非常适合使用。分析://1.高性能的无阻塞无界队列:(无界队列)ConcurrentLinkedQueue<String...原创 2021-08-03 17:46:12 · 235 阅读 · 0 评论 -
多线程——并发类容器——阻塞Queue模拟:自定义阻塞队列
什么是阻塞队列?如何进行模拟一个阻塞队列?拥有固定长度承装元素的容器计数器统计容器的容量大小当队列里面没有元素的时候需执行线程要等待当队列元素已满的时候执行线程也需要等待 模拟阻塞队列:AtomicInteger 能保证单个服务的一致性,支持并发put(obj)思想就是通过同步锁对list进行操作,循环list大小和最大值不同时,添加元素,相同时加锁,插入进数据后要唤醒对象get()思想就是通过同步锁对list进行操作,循环list大小和最小值,相同时加锁等待,插入进数据后,不同.原创 2021-08-02 18:28:46 · 111 阅读 · 0 评论 -
多线程——并发类容器——并发Queue以及实现ConcurrentLinkedQueue(高性能,高并发队列),BlockingQueue(阻塞队列,在存取时候会根据是否已经满/是否有数据进行阻塞)
在并发队列上JDK提供了两套实现,一个是以ConcurrentLinkedQueue为代表的高性能队列,一个是以BlockingQueue接口为代表的阻塞队列,无论哪种都继承自Queue接口!ConcurrentLinkedQueue ConcurrentLinkedQueue:是一个适用于高并发场景下的队列,通过无锁的方式,实现了高并发状态下的高性能,通常ConcurrentLinkedQueue性能好于BlockingQueue。它是一个基于链接节点的无界线程安全队...原创 2021-08-02 17:51:51 · 544 阅读 · 0 评论 -
多线程——Copy-On-Write容器——程序设计的优化策略
Copy-On-Write简称COW,是一种用于程序设计中的优化策略。JDK里的COW容器有两种:CopyOnWriteArrayListCopyOnWriteArraySetCOW容器非常有用,可以在非常多的并发场景中使用到。什么是CopyOnWrite容器?原创 2021-07-30 17:46:11 · 152 阅读 · 0 评论 -
多线程——并发类容器——ConcurrentMap以及实现类ConcurrentHashMap,ConcurrentSkipListMap(支持并发排序功能),画图工具ProsessOn
jdk5.0以后提供了多种并发类容器来替代同步类容器从而改善性能。同步类容器的状态都是串行化的。(100个请求,只有一个请求执行,执行后释放锁其他请求才能执行)他们虽然实现了线程安全,但是严重降低了并发性,在多线程环境时,严重降低了应用程序的吞吐量。1.ConcurrentMapConcurrentMap接口下有俩个重要的实现: ConcurrentHashMap ConcurrentSkipListMap(支持并发排序功能)ConcurrentHashMap内部使用段(原创 2021-07-30 17:23:06 · 376 阅读 · 0 评论 -
多线程——并发容器类——Vector(同步容器)HashTable(同步),同步类容器的线程安全使用
1.容器的概述:ConcurrentMap集合类使用与底层原理分析 CopyOnWrite集合类使用与底层原理分析 并发与阻塞队列Queue讲解 模拟阻塞队列实战 ArrayBlockingQueueConcurrentLinkedQueueSynchronousQueuePriorityBlockingQueue优先级队列DelayQueue延迟队列应用与实战 2.同步类容器的问题ConcurrentModificationException并发原创 2021-07-29 16:33:10 · 544 阅读 · 0 评论 -
多线程——知识点概括
1.并发容器类ConcurrentMap集合类使用与底层原理分析 CopyOnWrite集合类使用与底层原理分析 并发与阻塞队列Queue讲解 模拟阻塞队列实战 ArrayBlockingQueueConcurrentLinkedQueueSynchronousQueuePriorityBlockingQueue优先级队列DelayQueue延迟队列应用与实战 2.线程安全、核心概念线程安全、Synchronized核心概念 Threa..原创 2021-07-29 14:24:04 · 99 阅读 · 0 评论