JUC
文章平均质量分 91
线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位,而多线程就是指从软件或者硬件上实现多个线程并发执行的技术,具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。
鱼找水需要时间
千里之行,积于跬步;万里之船,成于罗盘
展开
-
Java线程知识点总结
Thread、Runnable、Callable、Future、wait、notify、notifyAll、join、sleep、yeild、线程状态、线程通信原创 2023-03-05 16:29:50 · 3782 阅读 · 25 评论 -
Java并发简介(什么是并发)
进程、线程、安全性、活跃性、性能、死锁、饥饿、上下文切换原创 2023-03-02 21:30:28 · 4827 阅读 · 32 评论 -
JUC 常用 4 大并发工具类 CountDownLatch、CyclicBarrier、Semaphore、ExChanger
JUC就是java.util.concurrent包,这个包俗称JUC,里面都是解决并发问题的一些定义类,包括,CountDownLatch,CyclicBarrier,Semaphore,ExChanger原创 2023-02-05 15:22:09 · 1542 阅读 · 8 评论 -
Java 并发编程之Semaphore详解
Semaphore当前在多线程环境下被广泛使用,信号量是个很重要的概念,在进程控制方面都有应用。Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire()获取一个许可,如果没有就等待,而 release() 释放一个许可。比如在Windows下可以设置共享文件的最大客户端访问个数。原创 2023-01-02 00:33:18 · 4653 阅读 · 27 评论 -
Redisson中的“琐事”
Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publish / Subscribe, Bl原创 2023-01-01 20:52:05 · 1375 阅读 · 20 评论 -
Java用户线程和守护线程,线程默认Daemon值是false吗?
Java中通常有两种线程:**用户线程**和**守护线程**(也被称为服务线程)通过`Thread.setDaemon(false)`设置为**用户线程**(默认为用户线程)通过`Thread.setDaemon(true)`设置为**守护线程**线程属性的设置要在线程启动之前,否则会报`IllegalThreadStateException`异常原创 2022-12-16 21:52:58 · 1075 阅读 · 23 评论 -
Java CyclicBarrier循环屏障 多线程处理数据 性能优化
`CyclicBarrier` 字面意思是循环栅栏,是一个同步的工具,能够允许一组线程去互相等待直到都到达了屏障,`CyclicBarrier`对于涉及到固定大小的线程是非常有用的,线程们必须相互等待。该屏障称之为**循环屏障**,是因为当等待屏障的线程被释放之后,该屏障能循环使用。原创 2022-12-14 23:26:42 · 3392 阅读 · 24 评论 -
Spring 四种方式教你异步接口返回结果
Spring通过@Async、子线程、Future异步任务、Spring自带事件监听都可以完成异步接口返回结果原创 2022-08-27 14:35:42 · 4759 阅读 · 11 评论 -
Java 多线程分批同步数据
最近接到一个任务,将mysql中的数据同步到中,要求异步执行,接口不必返回结果,接到请求后后台默默执行就行了。这种情况下其实单线程一页一页去读取写入就可以了,因为不必立刻返回请求结果后台执行5分钟还是十分钟只要能把数据加入到es中就可以了。但是,身为一个优秀的程序员 怎么只能考虑功能的实现不考虑效率问题呢😎😎😎(时间允许的情况下考虑效率对已完成功能的代码做优化),这里就用到了多线程分批导入。注意这里一定要分批,不要所有线程一块去执行 要按批次。.........原创 2022-08-12 22:09:35 · 3219 阅读 · 7 评论 -
多线程并发之CountDownLatch阻塞等待
latch则是门闩、锁住的含义。整体含义可以理解为倒数的门栓。的作用也是如此,在构造的时候需要传入一个整数n(必须>0),在这个整数“倒数”到0之前,主线程需要等待在门口,而这个“倒数”过程则是由各个执行线程驱动的,每个线程执行完一个任务“倒数”一次。总结来说,的作用就是等待其他的线程都执行完任务,必要时可以对各个任务的执行结果进行汇总,然后主线程才继续往下执行。主要有两个方法:和。方法用于使计数器减一,其一般是执行任务的线程调用,方法则使调用该方法的线程处于等待状态,其一般是主线程调用。......原创 2022-07-01 12:28:10 · 6920 阅读 · 0 评论 -
优雅的自定义 ThreadPoolExecutor 线程池
java 中经常需要用到多线程来处理一些业务,非常不建议单纯使用继承或者实现接口的方式来创建线程,那样势必有创建及销毁线程耗费资源、线程上下文切换问题。同时创建过多的线程也可能引发资源耗尽的风险,这个时候引入线程池比较合理,方便线程任务的管理。java中涉及到线程池的相关类均在 jdk 1.5 开始的包中,涉及到的几个核心类及接口包括:等。JDK 自动创建线程池的几种方式都封装在工具类中:使用的构造方式为设置了(此时该参数没作用),无界队列,任务可以无限放入,当请求过多时(任务处理速度跟不上任务提交速度造原创 2022-06-27 12:59:51 · 3918 阅读 · 0 评论 -
Java 多线程之间如何通知通信
需求:有两个线程,A 线程向一个集合里面依次添加元素“abc”字符串,一共添加十次,当添加到第五次的时候,希望 B 线程能够收到 A 线程的通知,然后 B 线程执行相关的业务操作。线程间通信的模型有两种:共享内存和消息传递,以下方式都是基本这两种模型来实现的。基于 volatile 关键字来实现线程间相互通信是使用共享内存的思想。大致意思就是多个线程同时监听一个变量,当这个变量发生变化的时候 ,线程能够感知并执行相应的业务。这也是最简单的一种实现方式2.使用 Object 类的 wait()/notify原创 2022-06-27 11:44:08 · 4068 阅读 · 0 评论 -
ReentrantLock、ReentrantReadWriteLock、StampedLock
无锁→独占锁→读写锁→邮戳锁读写锁定义: 一个资源能够被多个读线程访问,或者被一个写线程访问,但是不能同时存在读写线程。意义和特点:读写锁ReentrantReadWriteLock并不是真正意义上的读写分离,它只允许读读共存,而读写和写写依然是互斥的,大多实际场景是“读/读”线程间并不存在互斥关系,只有"读/写"线程或"写/写"线程间的操作需要互斥的。因此引入ReentrantReadWriteLock。一个ReentrantReadWriteLock同时只能存在一个写锁但是可以存在多个读锁,但不能同原创 2022-06-26 23:30:00 · 3842 阅读 · 0 评论 -
AQS抽象队列同步器
抽象的队列同步器AbstractOwnableSynchronizerAbstractQueuedLongSynchronizerAbstractQueuedSynchronizer 通常地:AbstractQueuedSynchronizer简称为AQS解释:是用来构建锁或者其它同步器组件的重量级基础框架及整个JUC体系的基石,通过内置的FIFO队列来完成资源获取线程的排队工作,并通过一个int类变量表示持有锁的状态CLH:Craig、Landin and Hage原创 2022-06-26 20:15:00 · 3737 阅读 · 0 评论 -
Synchronized与锁升级
用锁能够实现数据的安全性,但是会带来性能下降。无锁能够基于线程并行提升程序性能,但是会带来安全性下降。synchronized锁:由对象头中的Mark Word根据锁标志位的不同而被复用及锁升级策略java5以前,只有Synchronized,这个是操作系统级别的重量级操作,重量级锁,假如锁的竞争比较激烈的话,性能下降java的线程是映射到操作系统原生线程之上的,如果要阻塞或唤醒一个线程就需要操作系统介入,需要在户态与核心态之间切换,这种切换会消耗大量的系统资源,因为用户态与内核态都有各自专用的内存空间,原创 2022-06-26 20:00:00 · 3982 阅读 · 0 评论 -
Java对象内存布局和对象头
1、对象的内存布局在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)2、对象在堆内存中的存储布局Mark Word:对象标记Class Pointer:类元信息(又叫类型指针)对象内部结构分为:对象头、实例数据、对齐填充(保证8个字节的倍数,8、16、24。。。)。对象头分为对象标记(markOop)和类元信息(klassOop),类元信息存储的是指向该对象类元数据(klass)的首地址。在6原创 2022-06-26 15:42:37 · 4108 阅读 · 0 评论 -
ThreadLocal之强、弱、软、虚引用
ThreadLocal提供线程局部变量。这些变量与正常的变量不同,因为每一个线程在访问ThreadLocal实例的时候(通过其get或set方法)都有自己的、独立初始化的变量副本。ThreadLocal实例通常是类中的私有静态字段,使用它的目的是希望将状态(例如,用户ID或事务ID)与线程关联起来。实现每一个线程都有自己专属的本地变量副本(自己用自己的变量不麻烦别人,不和其他人共享,人人有份,人各一份),主要解决了让每个线程绑定自己的值,通过使用get() 和set() 方法,获取默认值或将其值更改为当前线原创 2022-06-26 15:25:57 · 5697 阅读 · 1 评论 -
原子操作类Atomic
2.Thread.sleep→CountDownLatch2. 数组类型原子类AtomicIntegerArrayAtomicLongArrayAtomicReferenceArray3.引用类型原子类AtomicReference自旋锁SpinLockDemoAtomicStampedReference携带版本号的引用类型原子类,可以解决ABA问题解决修改过几次状态戳原子引用ABADemoAtomicMarkableReference原子更新带有标记位原创 2022-06-26 15:10:01 · 4021 阅读 · 0 评论 -
CAS之比较并交换
多线程环境 使用原子类保证线程安全(基本数据类型)2. CAS是什么compare and swap的缩写,中文翻译成比较并交换,实现并发算法时常用到的一种技术。它包含三个操作数——内存位置、预期原值及更新值。执行CAS操作的时候,将内存位置的值与预期原值比较:如果相匹配,那么处理器会自动将该位置值更新为新值,如果不匹配,处理器不做任何操作,多个线程同时执行CAS操作只有一个会成功。 CAS有3个操作数,位置内存值V,旧的预期值A,要修改的更新值B。当且仅当旧的预期值A和内存值V相同时,将内存原创 2022-06-26 14:59:54 · 4158 阅读 · 0 评论 -
volatile与JMM
可见性写完后 立即刷新回主内存并及时发出通知,大家可以去主内存拿最新版,前面的修改对后面所有线程可见有序性不存在数据依赖关系,可以重排序存在数据依赖关系,禁止重排序但重排后的指令绝对不能改变原有的串行语义!这点在并发设计中必须要重点考虑! 当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值 立即刷新回主内存中当读一个volatile变量时,JMM会把该线程对应的本地内存设置为无效,重新会到主内存中读取最新共享变量所以volatile的写内存语义是直接刷新到主内存中,读的内原创 2022-06-26 14:55:32 · 3859 阅读 · 0 评论 -
Java内存模型JMM
计算机存储结构,从本地磁盘到主存到CPU缓存,也就是从硬盘到内存,到CPU。一般对于的程序的操作就是从数据库查数据到内存然后到CPU进行计算因为有这么多级的缓存(cpu和物理主内存的速度是不一致的)CPU的运行并不是直接操作内存而是先把内存里边的数据读到缓存,而内存的读和写操作的时候就会造成不一致的问题JVM规范中试图定义一种Java内存模型(Java Memory Model,简称 JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。JMM本原创 2022-06-26 14:50:49 · 3813 阅读 · 0 评论 -
Java中的锁
认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。synchronized关键字和Lock的实现类都是悲观锁适用场景:适合写操作多的场景,先加锁可以保证写操作时数据正确。认为自己在使用数据时不会有别的线程修改数据或资源,所以不会添加锁。在Java中是通过使用无锁编程来实现,只是在更新数据的时候去判断,之前有没有别的线程更新了这个数据。如果这个数据没有被更新,当前线程将自己修改的数据成功写入。如果这个数据已经被其他线程更新,则根据不同的实现方式执行原创 2022-06-26 14:45:56 · 4313 阅读 · 0 评论 -
JUC - 线程中断与线程等待、唤醒(LockSupport)
什么是中断机制? 首先 一个线程不应该由其他线程来强制中断或停止,而是应该有线程自己自行停止,自己来决定自己的命运。 所以,Thread.stop, Thead.suspend, Thead.resumer都已经被废弃了。 其次 在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。 因此,Java提供了一种用于停止线程的协商机制–中断,即中断标识协商机制。中断只是一种协商协作机制,Java中没有给中断增加任何语法,中断的过程完全需要程序员自己实现。原创 2022-06-21 23:27:16 · 4219 阅读 · 0 评论 -
JUC-Java多线程Future,CompletableFuture
1把锁:synchronized2个并:并发(concurrent)在同一实体上的多个事件,在一台处理器上“同时处理多个任务”,同一时刻,其实是只有一个时间在发生 并行(parallel)在不同实体上的多个时间,在多台处理器上同时处理多个任务,同一时刻,大家都在做事情,你做你的,我做到我的,但是我们都在做3个程:进程:在系统中运行的一个应用程序就是一个进程,每一个进程都有自己的内存空间和系统资源 线程:也被成为轻量级进程,在一个进程中会有1个或多个进程,是大多数原创 2022-06-12 17:20:53 · 5002 阅读 · 0 评论