并发编程
文章平均质量分 81
并发编程是指在一台处理器上“同时”处理多个任务
y_bccl27
这个作者很懒,什么都没留下…
展开
-
Java线程的六种状态
上面认识了线程的关键状态Runnable,那么接下来我们来看一下下面的三个状态,这三个状态我们可以统一称为阻塞状态,它们分别是Blocked(被阻塞)、Waiting(等待)、TimedWaiting(计时等待)。在我们接触编程时,就开始接触各种生命周期,比如对象的生命周期,程序的生命周期等等,对于线程来说也是存在自己的生命周期,今天我们主要介绍线程的生命周期及其各种状态的转换。状态,当它运行到任务的一半时,执行该线程的CPU被调度去做其它事情,导致该线程暂时不运行,它的状态依然不变,还是。........原创 2022-07-17 11:12:55 · 249 阅读 · 0 评论 -
synchronized
1.synchronized的介绍synchronized属于Java关键字,属于JVM层次,特别说明它不是一个类,也不是一个接口线程安全概念:当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的。synchronized:可以在任意对象及方法上加锁,而加锁的这段代码称为“互斥区”或“临界区”2. synchronized修饰普通方法2.1 多个线程一个锁当多个线程访问MyThread里面的run方法时,以排队的方式进行处理.原创 2022-03-22 11:41:18 · 431 阅读 · 0 评论 -
单例与多线程
一、单例与多线程的介绍单例模式,最常见的就是饥饿模式和懒汉模式,一个直接实例化对象,一个在调用方法时才进行实例化对象。在多线程模式中,考虑到性能和线程安全问题,我们一般选择下面两种比较经典的单例模式,在提高性能的同时,又保证了线程安全。1.双重校验锁2.静态内部类二、双重校验锁public class DubbleSingleton { private static DubbleSingleton ds; public static DubbleSingleton ge原创 2022-04-03 14:59:40 · 125 阅读 · 0 评论 -
并发的三大特性
当线程2更改了stop变量的值之后,但是还没来得及写入主存当中,线程2转去做其它事情了,那么线程1由于不知道线程2对stop变量的更改,因此还会一直循环下去。write方法里的1和2做了重排序,线程1先对flag赋值为true,随后执行到线程2,ret直接计算出结果,再到线程1,这时候a才赋值为2,很明显迟了一步。若两个线程在不同的cpu,那么线程1改变了i的值还没刷新到主存,线程2又使用了i,那么这个i值肯定还是之前的,线程1对变量的修改线程没看到这就是可见性问题。...原创 2022-08-14 16:57:55 · 384 阅读 · 0 评论 -
ThreadLocal
ThreadLocal是线程的局部变量,是一种多线程间并发访问变量的解决方案。与synchronized加锁的方式不同,ThreadLocal完全不提供锁,而是使用以空间换时间的手段,为每一个线程提供变量的独立副本,以保障线程安全。原创 2022-04-03 15:31:51 · 574 阅读 · 0 评论 -
volatile
一、valitile的概念volatile关键字的主要作用是使变量在多个线程间可见原创 2022-04-04 13:40:45 · 358 阅读 · 0 评论 -
wait与notify
一、线程通信概念线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体,线程间的通信就成为整体的必用方式之一。当线程存在通信指挥,系统间的交互性会更强大,在提高CPU利用率的同时还会使开发人员对线程任务在处理的过程中进行有效的把控与监督。升级版本:CountDownLatch...原创 2022-04-03 22:33:12 · 82 阅读 · 0 评论 -
AtomicInteger
AtomicInteger是java.util.concurrent.atomic包下面的原子操作类,可以用原子方式更新int值。其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择一个其它线程进入。示例代码:import java.util.concurrent.CountDownLatch;import java.uti原创 2020-06-28 15:21:56 · 168 阅读 · 0 评论 -
Java并发包下的CAS相关的原子操作
一、场景引入,问题凸现假设多个线程需要对一个变量不停地累加1:public class HelloWorld{ private int data=0; //多个线程同时对data变量执行操作: data++;}实际上,上面那段代码是不ok的,因为多个线程直接这样并发的对一个data变量进行修改,是线程不安全性的行为,会导致data值的变化不遵循预期的值来改变。举个例子,比如说20个线程分别对data执行异常data++操作,我们以为最后data的值会变成20,其实原创 2022-04-06 21:23:38 · 82 阅读 · 0 评论 -
同步类容器与并发类容器
一、同步类容器同步类容器都是线程安全的,但在某些场景下可能需要加锁来保护复合操作。复合类操作:迭代(反复访问元素,遍历完容器中所有的元素)、跳转(根据指定的顺序找到当前元素的下一个元素)、以及条件运算。这些复合操作在多线程并发地修改容器时,可能会表现出意外的行为,最经典的便是ConcurrentModificationException,原因是当容器迭代的过程中,被并发的修改了内容,这是由于早期迭代器设计的时候并没有考虑并发修改的问题。import java.util.Iterator;impo原创 2022-04-05 14:04:52 · 566 阅读 · 0 评论 -
CopyOnWriteArrayList
CopyOnWriteArrayList 是 java.util.concurrent 包提供的类,它实现了读操作无锁,写操作则通过操作底层数组的的新副本来实现,是一种读写分离的并发策略。应用场景:例如在电商系统中需要将经常参加抢购但是抢完之后不付款的用户加入黑名单,这个时候如果说站在Java的数据结构里面,我们会想到使用哪种呢?自然而然CopyOnWriteArrayList成为了首选那么为什么选择这个了,首先的话抢购加入黑名单的数量并不是很大,在抢购的过程中查询黑名单的读操作是非常频繁,但是写操原创 2022-04-03 23:01:54 · 512 阅读 · 0 评论 -
并发队列-Queue
1.并发队列的介绍在并发队列上JDK提供了两套实现,一个是以ConcurrentLinkedQueue为代表的高性能队列,一个是以BlockingQueue接口为代表的阻塞队列,无论哪种都继承自Queue。2.ConcurrentLinkedQueueConcurrentLinkedQueue:是一个适用于高并发场景下的队列,通过无锁的方式,实现了高并发状态下的高性能,通常ConcurrentLinkedQueue性能好于BlockingQueue。它是一个基于链接节点的无界线程安全队列。该原创 2022-04-05 10:57:52 · 447 阅读 · 0 评论 -
线程池框架-Executor
为了更好的控制多线程,JDK提供了一套线程框架Executor,帮助开发人员有效地进行线程控制。它们都在java.util.concurrent包中,是JDK并发包的核心。其中有一个比较重要的类:Executors,它扮演着线程工厂的角色,我们通过Executors可以创建特定功能的线程池。原创 2022-03-04 14:38:15 · 521 阅读 · 0 评论 -
使用动态线程池优化你的代码
线程并发处理优化原创 2024-06-02 10:30:00 · 671 阅读 · 0 评论 -
线程池框架-Spring线程池
线程池框架-Spring线程池原创 2022-09-10 23:50:32 · 271 阅读 · 0 评论 -
CountDownLatch
CountDownLatch是一个同步计数器,初始化的时候传入需要等待执行完成的线程数。await():阻塞当前线程,等待其他线程执行完成,直达计数器计数值减到0countDown():负责计算器的减1操作以下为示例代码:package com.bc.test;import java.util.concurrent.CountDownLatch;public class CountDownLatchDemo { public static void main(String原创 2020-06-26 14:14:54 · 147 阅读 · 0 评论 -
CyclicBarrier
CyclicBarrier字面意思是“循环栅栏”,它的作用就是会让所有线程都等待完成后才会继续下一步行动。举个例子:就像生活中我们会约朋友们到某个餐厅一起吃饭,有些朋友可能会早到,有些朋友可能会晚到,但是这个餐厅规定必须等到所有人到齐之后才会让我们进去。这里的朋友们就是各个线程,餐厅就是 CyclicBarrier。CyclicBarrier的构造方法:public CyclicBarrier(int parties)public CyclicBarrier(int parties, Run原创 2020-06-27 16:22:27 · 153 阅读 · 0 评论 -
Semaphore
Semaphone是一个信号量,必须由获取它的线程释放。常用于限制可以访问某些资源的线程数量,例如通过 Semaphore 限流。看到这里的话,如果不是很理解前面这段话是什么意思,可以先去看看案例代码展示部分,看完后再回头来看看这句话就会有一个新的比较清晰的认识。Semaphone只有3个操作:1.初始化Semaphore semaphore = new Semaphore(3);2.增加//释放许可semaphore.release();3.减少//获取许可sema原创 2020-06-26 11:34:30 · 167 阅读 · 0 评论 -
谈谈对AQS的理解
一、ReentrantLock和AQS的关系首先我们来看看,如果用Java并发包下的ReentrantLock来加锁和释放锁,是个什么样的感觉?这个基本学过Java的同学应该都会吧,毕竟这个是Java并发基本API的使用,应该每个人都是学过的,所以我们直接看一下代码就好了:ReentrantLock lock=new ReentrantLock();lock.lock(); //加锁// 业务逻辑代码lock.unlock(); //释放锁上面那段代码应该不难理解吧,无非就是搞一原创 2022-04-08 23:56:23 · 135 阅读 · 0 评论 -
AQS实现原理分析
一、AQS的介绍队列同步器(AbstractQueuedSynchronizer)简称AQS,是JUC同步构件的基础,包括ReentrantLock、ReentrantReadWriteLock、CountDownLatch、Semaphor都是基于AQS实现的。理解AQS是理解这些同步工具的基础,基于AQS提供的同步语义可以定制各种功能的同步工具。二、AQS原理1、用一个int类型的状态变量(volatile)state记录同步状态,默认值是02、用一个双向链表实现的队列对线程进行排原创 2022-04-09 22:00:48 · 423 阅读 · 0 评论 -
重入锁和读写锁
一、重入锁和读写锁的引入在Java多线程中,我们知道可以使用synchronized关键字来实现线程间的同步互斥工作,那么其实还有一个更优秀的机制去完成这个“同步互斥”工作,它就是Lock对象,我们主要学习两种锁,重入锁和读写锁。它们具有比synchronized更为强大的功能,并且有嗅探锁定、多路分支等功能。重入锁(重入锁在需要进行同步的代码部分加上锁定,但不要忘记最后一定要释放锁定,不然会造成锁永远无法释放,其它线程永远进不来的结果。原创 2022-09-04 17:46:47 · 246 阅读 · 0 评论 -
StampedLock
邮戳锁(StampedLock)提供三种模式的锁:分别为写锁、悲观读锁、乐观读锁原创 2023-03-19 22:28:49 · 347 阅读 · 0 评论 -
JMH - 微基准测试
JMH全称“Java Microbenchmark Harness(微基准测试框架)”,是专门用于Java代码微基准测试的一套测试工具API,是由OpenJDK/Oracle官方发布的工具。原创 2021-05-08 17:18:10 · 2355 阅读 · 0 评论 -
ObjectMapper,别再像个二货一样一直new了!
保持良好的编码习惯永远是好的,高性能的代码都是点点滴滴积累起来的。原创 2024-08-24 11:00:00 · 356 阅读 · 1 评论