并发编程
文章平均质量分 97
ゞ浪人与酒丶0
有一种力量无人能抵挡,它永不言败生来倔强。有一种理想照亮了迷茫,在那写满荣耀的地方。
展开
-
并发编程 - 多线程创建方式
线程与进程的区别每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。使用线程可以把占据时间长的程序中的任务放到后台去处理,程序的运行速度可能加快,在一些等待的任务实现上如用户输...原创 2020-03-22 15:18:23 · 666 阅读 · 1 评论 -
并发编程 - Volatile关键字
Volatile关键字首先了解Voiatile关键字,需要了解线程的三大特性1. 原子性: 要么成功,要么失败2. 可见性: 多个线程同时访问一个变量时,一个线程修改了这个变量值,其他线程立马可以看到3. 有序性: 程序的执行顺序按现在的顺序了解了线程3打特性,我们就可以深入了解Volatile关键字了1.什么是VolatileVolatile是java虚拟机提供的轻量级同步机制...原创 2020-04-19 14:41:03 · 823 阅读 · 1 评论 -
并发编程 - 守护线程与非守护线程
多线程–守护线程与非守护线程1.什么是守护线程,什么是非守护线程什么是守护线程,和main相关,用户线程,用户自己创建的线程,如果主线程停止掉,不会影响用户线程用户线程也叫非守护线程gc线程 (线程不定时回收垃圾)属于守护线程当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程2.守护线程特征:有一个特征,和主线程一起销毁3.非守护线程特征:和主线程互不影响...原创 2020-04-25 11:13:19 · 1353 阅读 · 0 评论 -
并发编程 - Synchronized
1.为什么要使用synchronized在并发编程中存在线程安全问题,主要原因有:1.存在共享数据 2.多线程共同操作共享数据。关键字synchronized可以保证在同一时刻,只有一个线程可以执行某个方法或某个代码块,同时synchronized可以保证一个线程的变化可见(可见性),即可以代替volatile。案例package com.yxl.demo.ThreadTest;publ...原创 2020-04-26 11:37:22 · 1604 阅读 · 1 评论 -
并发编程 - 死锁
1. 什么是多线程死锁?同步中嵌套同步,导致锁无法释放多线程以及多进程改善了系统资源的利用率并提高了系统 的处理能力。然而,并发执行也带来了新的问题——死锁。所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。1、系统资源的竞争通常系统中拥有的不可剥夺资源,其数量不足以满足多个进程运行的需要,使得进程在运行过程中,会因争夺资源而陷入僵局,如磁...原创 2020-04-26 12:17:21 · 930 阅读 · 0 评论 -
并发编程 - 三大特性
多线程有三大特性原子性、可见性、有序性1.什么是原子性即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。一个很经典的例子就是银行账户转账问题:比如从账户A向账户B转1000元,那么必然包括2个操作:从账户A减去1000元,往账户B加上1000元。这2个操作必须要具备原子性才能保证不出现一些意外的问题。我们操作数据也是如此,比如i = i+1;其中就包...原创 2020-04-26 22:28:08 · 988 阅读 · 0 评论 -
并发编程 - Lock锁
Lock锁在 jdk1.5 之后,并发包中新增了 Lock 接口(以及相关实现类)用来实现锁功能,Lock 接口提供了与 synchronized 关键字类似的同步功能,但需要在使用时手动获取锁和释放锁,且在使用上比synchronized更加灵活。1、使用ReentrantLock实现同步案例:package com.yxl.demo.ThreadTest;public class...原创 2020-04-27 17:26:30 · 851 阅读 · 0 评论 -
JUC--CountDownLatch
(计数器)CountDownLatchCountDownLatch 类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值...原创 2020-05-01 14:49:36 · 1402 阅读 · 0 评论 -
【并发容器精讲三、】并发队列Queue
文章目录1. 为什么要使用队列2. 并发队列简介3. 各并发队列关系图4. 阻塞队列 BlockingQueue5. 非阻塞队列6. 如何选择适合的队列1. 为什么要使用队列用队列可以在线程间传递数据:生产者,消费者模式,银行转帐考虑锁等线程安全问题重任 转移到队列上2. 并发队列简介简单介绍各个并发并发队列的关系,并发队列是指线程安全的队列,包含:阻塞队列和非阻塞队列,区别如下。阻塞队列:满了之后不能再插入,当队列为空的时候,读不到会阻塞非阻塞队列:和阻塞队列完全不一样的3. 各并原创 2020-07-12 21:20:34 · 1083 阅读 · 0 评论 -
ThreadLocal 源码分析
文章目录介绍应用场景数据结构Hash算法源码解读1. ThreadLocalMap2. set ·····介绍ThreadLocal,作者:Josh Bloch and Doug LeaThreadLocal提高一个线程的局部变量,访问某个线程拥有自己局部变量。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。static final ThreadLocal&l原创 2021-04-05 20:53:56 · 1174 阅读 · 5 评论 -
AQS原理解析
文章目录1. AQS介绍2. AQS原理3. 源码分析AQS 模版方法模式加锁 (独占锁 )释放锁 (独占锁 )加锁 (共享锁)释放锁 (共享锁)1. AQS介绍 AQS 的全程为 (AbstractQueuedSynchronizer)这个类在 java.util.concurrent.locks 包下public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer im原创 2021-04-21 20:03:36 · 574 阅读 · 0 评论 -
JUC中的Atomic原子类
文章目录Atomic 原子类1. 原子类介绍2. 基本类型原子类3. 数组类型原子类Atomic 原子类1. 原子类介绍不可分割的一个操作是不可中断的,即使多线程的情况下也可以保证, 即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。原子类的作用和锁类似,是为了保证并发情况下线程安全,不过相比于锁,更有优势优势: 粒度更细,效率更高原子类纵览:类型ValueAtomic*基本类型原子类AtomicIntegerAtomicLon原创 2021-04-16 14:46:42 · 344 阅读 · 1 评论 -
深入Java线程池
文章目录一、什么是线程池二、Executor 框架2.1 Executor 框架组成2.2 Executor 结构2.2 Executor 使用三、ThreadPoolExecutor 解析3.1 构造方法一、什么是线程池线程池就是创建若干个可执行的线程放入一个池(容器)中,有任务需要处理时,会提交到线程池中的任务队列,处理完之后线程并不会被销毁,而是仍然在线程池中等待下一个任务。Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中原创 2021-04-14 14:04:04 · 577 阅读 · 4 评论 -
线程池:业务代码常见的问题
线程池:业务代码常见的问题在程序中,我们会使用各种池优化缓存创建昂贵的对象,比如线程池、连接池、内存池。一般是预先创建一些对象放入池中,使用的时候直接取出使用,用完归还以便复用,还会通过一定策略调整池中缓存的对象数量,实现动态伸缩。由于线程的创建比较昂贵,随意、没有控制地创建大量线程会造成性能问题,因此短平快的任务一般优先考虑使用线程池来处理,而不是直接创建线程1. 线程池的声明需要手动进行Java 中的 Executors 类定义了一些快捷的工具方法,来帮助我们快速创建线程池。《阿里 巴原创 2020-11-25 21:46:13 · 841 阅读 · 0 评论 -
使用了并发工具类库,线程就安全了吗?
使用了并发工具类库,线程就安全了吗并发工具类库有时会听到有关线程安全和并发工具的一些片面的观点和结论,比如“把 HashMap 改为 ConcurrentHashMap ,要不我们试试无锁的 CopyOnWriteArrayList 吧,性能更好,事实上,这些说法都特殊场景下都不太准确为了方便开发者进行多线程编程,现代编程语言提供了各种并发工具类 并且提供了 JUC 包 java.util.concurrent , 但是没有充分了解他们的使用场景、解决的问题,以及最佳实践的话,盲目使原创 2020-11-21 12:08:35 · 699 阅读 · 1 评论 -
CyclicBarrier循环栅栏
文章目录CyclicBarrier循环栅栏和CountDownLatch 很类似 ,都能阻塞一组线程当有大量线程相互配合,分别计算不同任务,并且需要最后统一汇总的时候,我们可以使用CyclicBarrier 。CyclicBarrier可以构造一个集结点,当某一个线程执行完毕,他就会到集结点等待,知道所有线程都到了集结点,那么该栅栏就被撤销,所以有线程在统一出发,继续执行剩下都任务。生活中的例子:“ 咋们3个人明天中午在学校碰面,都到齐后,一起讨论下学期的计划”代码演示package com原创 2020-07-19 12:43:38 · 636 阅读 · 0 评论 -
Condition接口(又称条件对象)
文章目录1.作用2.代码演示1.作用当线程1需要等待某个条件的时候 ,它就去执行 condition.await() 方法,一旦执行了 await()方法,线程就会进入阻塞状态然后通常会有另外一个线程,假设是线程2,去执行对应的条件,知道这个条件成立,线程2就会去执行condition.signal() 方法,这是 JVM 就会被从阻塞的线程里找到那些等待该condition的线程,当线程1就会收到可执行信号的时候,他的线程状态就会变成Runnable 可执行状态signalAll() 和si原创 2020-07-16 23:18:01 · 970 阅读 · 0 评论 -
Semaphore信号量
Semaphore信号量 - Semaphore 可以用来限制或管理数量有限资源的使用情况- 信号量的作用是用来维护一个“许可证”,的计数,线程可以获取 许可证,那信号量剩余许可证就减一,线程也可以是否一个许可证,那剩余的许可证就加一,当信号量拥有的许可证为0时,那么下一个线程想获得许可证,就要进行等待,直到另外线程释放许可证信号量使用流程: 1.初始化Semaphore 并指定许可证的数量 : 2.在需要被现在的代码前加acquire() 或者 acquireUninterruptibly原创 2020-07-14 22:09:17 · 832 阅读 · 0 评论 -
【并发容器精讲二、】CopyOnWriteArrayList
文章目录1. 诞生的历史和原因2. 适用场景3. 读写规则4. 实现原理5. 缺点6. 源码分析1. 诞生的历史和原因代替Vector和SyschronizedList 就像 ConcurrentHashMap 代替了SyschronizedMap的原因一样Vector和SyschronizedList 锁的粒度太大,并发效率较低,并且迭代时无法编辑Copy-On-Write 并发容器还包括CopyOnWriteArraySet,用来代替同步 Set2. 适用场景读操作尽可能的快一些,原创 2020-07-02 21:16:21 · 755 阅读 · 0 评论 -
【并发容器精讲一、】ConcurrentHashMap
ConcurrentHashMap1. 磨刀不误砍柴功 :Map简介2. 为什么需要ConcurrentHashMap3. 九层之台,起于累土,罗马不是一天建成的:HashMap分析4. JDK1.7 中 ConcurrentHashMap 实现和分析5. JDK1.8 中 ConcurrentHashMap 实现和源码分析6. 对比1.7 与 1.8 ,为什么要把1.7的结构改成1.8的结构7. 组合操作:ConcurrentHashMap也不是线程安全的?8. 实际生产案例分享1. 磨刀不误砍柴功 :原创 2020-06-29 22:13:08 · 919 阅读 · 0 评论 -
CAS原理
文章目录什么是CAS案例演示应用场景缺点什么是CAS处理并发问题我认为V的值应该是A,如果是的话我就把它修改成B,如果不是A,那么说明A被人修改过了,那我就不修改了,避免多人同时修改造成错误,CAS 有3个操作数,内存值 V,预期值A,要修改的值 B,当且仅预期值A和内存值V 相同时,才将内存值修改为 B, 否则什么都不做,最后返回现在的 V 值CAS算法理解(1)与锁相比,使用比较交换(下文简称CAS)会使程序看起来更加复杂一些。但由于其非阻塞性,它对死锁问题天生免疫,并且,线程间的相互原创 2020-06-10 23:03:10 · 680 阅读 · 0 评论 -
自旋锁与阻塞锁
自旋锁阻塞或者唤醒一个Java线程需要操作系统切换CPU 状态来完成,这种状态转换 需要耗费处理器时间如果同步代码块到代码过于简单,状态转换到时间有kennel比用户执行代码到时间还长在许多场景下,同步资源到锁定时间短,为了这小段时间切换线程,线程的挂起和恢复可能会让系统得不偿失,这里是为了当前线程“ 稍等一下”, 我们需要让当前线程进行自旋 ,如果自旋完成后前面锁定同步资源的线程以及释放了锁,那么当前线程就没必要阻塞,而是直接获取同步资源,从而避免线程的开销阻塞锁和自旋锁相反,阻塞原创 2020-06-05 22:58:16 · 2947 阅读 · 0 评论 -
共享锁和排它锁
共享锁和排它锁以 ReentranReadWriteLock 读写锁为例什么是共享锁和排它锁排它锁,又称独占锁,独享锁 synchronized就是一个排它锁共享锁,又称为读锁,获得共享锁后,可以查看,但无法删除和修改数 据, 其他线程此时业获取到共享锁,也可以查看但是 无法这里是引用修改和 删除数据共享锁和排它锁典型是ReentranReadWriteLock 其中,读锁是共享锁,写锁是 排它锁读写锁的作用在没有读写锁之前,我们使用的是R原创 2020-06-04 23:42:40 · 10959 阅读 · 1 评论 -
公平锁与非公平锁
锁的分类什么是公平 与 非公平公平是按照线程的请求顺序,来分配锁 非公平是指不完全按照请求的顺序,在一定情况下,可以插队的注意:非公平也同样不提倡 插队行为,这里的非公平是指在合适的时机插队,而不是盲目的插队为什么要有非公平锁Java设计者 这样设计的目的,是为了提高效率避免唤醒带来的空档期公平的情况 ReentrantLock如果创建 ReentrantLock对象时,参数填写为 true ,那么这就是个公平锁 依次执行不公平的情况 ReentrantLock线程1 获取原创 2020-06-03 23:43:13 · 719 阅读 · 0 评论 -
可重入锁与非可重入锁
锁的分类什么是可重入锁可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提锁对象得是同一个对象或者class),不会因为之前已经获取过还没释放而阻塞。Java中ReentrantLock和synchronized都是可重入锁,可重入锁的一个优点是可一定程度避免死锁。ReentrantLock和synchronized都是重入锁,可重入锁的好处:【1.避免死锁】【2.提升封装性】案例实现电影院预定预定电影院座位预定座位就是个很好的lock原创 2020-06-03 23:03:18 · 1805 阅读 · 3 评论 -
悲观锁&乐观锁
锁都分类什么是悲观锁,乐观锁乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展。这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人。悲观锁&乐观锁设计思路悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,原创 2020-06-02 23:34:43 · 1060 阅读 · 1 评论 -
Java锁介绍
重入锁锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized(重量级) 和 ReentrantLock(轻量级)等等 ) 。这些已经写好提供的锁为我们开发提供了便利。重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。在JAVA环境下 ReentrantLock 和synchronized 都是 可重...原创 2020-05-05 13:49:19 · 781 阅读 · 0 评论 -
JUC--阻塞队列与非阻塞队
阻塞队列与非阻塞队区别队列:主要遵循先进先出,后进后出阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲起来,如从队列中移除一个或者多个元素...原创 2020-05-03 13:13:52 · 890 阅读 · 0 评论