![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程专题
文章平均质量分 71
_蓝天IT_
让亿万孩子同在蓝天下共享优质教育
展开
-
Java并发代码入门
示例-1: 使用自定义的变量来作为标志位.需要给标志位上加 volatile 关键字(这个关键字的功能后面介绍).@Overridewhile (!isQuit) {+ ": 别管我,我忙着转账呢!");try {+ ": 啊!险些误了大事");Thread thread = new Thread(target, "李四");+ ": 让李四开始转账。");+ ": 老板来电话了,得赶紧通知李四对方是个骗子!");原创 2024-05-06 19:53:15 · 681 阅读 · 1 评论 -
用Java简单实现一个分布式锁
方法中,我们模拟了多个线程同时访问不同的 key,通过分段锁的方式保证了对不同 key 的操作可以并发进行,提高了并发性能。方法中,根据给定的 key 计算出对应的段,然后获取该段的锁,执行需要加锁的操作,最后释放锁。对象用于锁定一个特定的段。在这个例子中,我们创建了一个。类,其中包含一个包含多个。原创 2024-04-24 12:05:11 · 141 阅读 · 1 评论 -
线程和进程【并发和并行、线程上下文切换、线程的状态】
一个CPU内核,同一时刻只能被一个线程使用。为了提升CPU利用率,CPU采用了时间片算法将CPU时间片轮流分配给多个线程,每个线程分配了一个时间片(几十毫秒/线程),线程在时间片内,使用CPU执行任务。当时间片用完后,线程会被挂起,然后把 CPU 让给其它线程。那么问题来了,线程再次运行时,系统是怎么知道线程之前运行到哪里了呢?CPU切换前会把当前任务状态保存下来,用于下次切换回任务时再次加载。任务状态的保存及再加载的过程就叫做上下文切换。任务状态信息保存在哪里呢?原创 2024-02-17 18:49:45 · 365 阅读 · 0 评论 -
Future和FutureTask
当线程的任务一旦执行完, 也就是当我们可以获取结果时,线程池会把该结果填入到之前给我们的那个Future中去(而不是创建一 个新的Future),我们此时可以从该Future中获得任务执行的结果。把Callable实例当作参数,生成FutureTask的对象,然后把这个对象当作一个Runnable对象,用线程池 去执行这个Runnable对象,最后通过FutureTask获取刚才执行的结果。FutureTask叫未来任务,可以将一个复杂的任务剔除出去交给另外一个线程来完成。原创 2024-02-07 14:54:18 · 774 阅读 · 0 评论 -
ThreadLocal
ThreadLocal 被译为线程本地变量”类,在 Java 的多线程并发执行过程中,为保证多个线程对变量的安 全访问,可以将变量放到ThreadLocal 类型的对象中,使变量在每个线程中都有独立值,不会出现一个 线程读取变量时而被另一个线程修改的现象。ThreadLocal 是解决线程安全问题一个较好方案,它通过为每个线程提供一个独立的本地值,去解决并 发访问的冲突问题。原创 2024-02-07 14:36:36 · 830 阅读 · 0 评论 -
【✔ ★非常重要手搓源码】(多线程)并发编程的三大基础应用——阻塞队列、定时器、线程池【手搓源码】【Callable AtomicInteger CountDownLatch】
老板还是很善于变通的,知道了为什么大家都要雇人了,所以指定了一个指标,公司业务人员会扩张到 3 个人,但还是随着业务逐步雇人。于是再有业务来了,老板就看,如果现在公司还没 3 个人,就雇一个人去送快递,否则只是把业务放到一个本本上,等着 3 个快递人员空闲的时候去处理。这个就是我们要带出的线程池的模式。因为阻塞队列中的任务都有各自的执行时刻 (delay). 最先执行的任务一定是 delay 最小的. 使用带优先级的队列就可以高效的把这个 delay 最小的任务找出来.一个任务,起一个线程进行处理的模式。原创 2023-10-25 20:57:47 · 78 阅读 · 0 评论 -
java手撕线程池
【代码】java手撕线程池。原创 2024-02-07 13:56:26 · 340 阅读 · 0 评论 -
【多线程例题】使用三个线程,分别可以打印A,B,C。要求实现三个线程协同打印,顺序打印出ABC。重复10次。【方法一:使用一个锁+一个信号实现根据信号打印】【方法二:使用三个锁,按着顺序解锁打印】
三个线程分别打印A,B,C方法一:通过count计数打印(三个线程上同样的锁,打印一个,召唤所有锁,如果不满足条件,则wait等待,锁自动解锁)原创 2024-02-07 11:13:27 · 1151 阅读 · 0 评论 -
并发容器+并发队列【ConcurentHashMap、CopyOnWriteArrayList、阻塞队列、ArrayBlockingQueue】
在JUC包中,有一大部分是关于并发容器的,如ConcurrentHashMap,ConcurrentSkipListMap, CopyOnWriteArrayList及阻塞队列。这里将介绍使用频率、面试中出现频繁的最高的 ConcurrentHashMap和阻塞队列。注意:这里说到的容器概念,相当于我们理解中的集合的概念。原创 2024-02-06 20:24:00 · 836 阅读 · 0 评论 -
线程协作工具类【CountDownLatch倒数门闩、Semaphore信号量、CyclicBarrier循环栏栅、Condition顺序打印ABC】
转自 极客时间线程协作工具类就是帮助程序员更容易的让线程之间进行协作,来完成某个业务功能。原创 2024-02-06 19:40:08 · 390 阅读 · 0 评论 -
ReentrantLock源码分析、LockSupport类、ReentrantReadWriteLock、锁优化的方法
我们看一下重入锁ReentrantLock类关系图,它是实现了Lock接口的类。NonfairSync和FairSync都继承 自抽象类Sync,在ReentrantLock中有非公平锁NonfairSync和公平锁FairSync的实现。在重入锁ReentrantLock类关系图中,我们可以看到NonfairSync和FairSync都继承自抽象类Sync,而 Sync类继承自抽象类AbstractQueuedSynchronizer(简称AQS)。原创 2024-02-05 19:41:58 · 827 阅读 · 0 评论 -
AQS简介、AQS实现原理、线程夺取锁失败 AQS队列的变化、线程被唤醒时 AQS队列的变化
AQS(全称AbstractQueuedSynchronizer)即队列同步器。它是构建锁或者其他同步组件的基础框 架(如ReentrantLock、ReentrantReadWriteLock、Semaphore等)。AQS是JUC并发包中的核心基础组件,其本身是一个抽象类。理论上还是利用管程实现的,在AQS中,有一个volatile修饰的state,获取 锁的时候,会读写state的值,解锁的时候,也会读写state的值。所以AQS就拥有了volatile的happens- before规则。原创 2024-02-05 17:17:47 · 909 阅读 · 0 评论 -
Java锁简介【隐式锁、显式锁、乐观锁、悲观锁、公平锁、非公平锁、独享锁、共享锁、自旋锁、分段锁、无锁、偏向锁、轻量级锁、重量级锁】
说的简单一点:容器里有多把锁,每一把锁用于锁容器其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率。ConcurrentHashMap所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。在O获得一个锁之后未释放锁之前,再次获得同一把锁时,只会增加获得锁的次数,当释放锁时,会同时减少锁定次数。:比较乐观,总是假设最好的情况,对于同一个数据的并发操作,原创 2024-02-05 14:10:49 · 864 阅读 · 0 评论 -
JUC【1.原子类、2.锁Lock、3.阻塞队列、4.并发集合容器、5.并发工具类、6.线程池】、原子类、CAS、JUC和Synchronized锁对比
1. JUC简介2. 原子类与CAS2.1 Atomic包2.2 CAS介绍2.3 CAS原理详解2.4 CAS缺陷转自 极客时间从JDK1.5起,Java API 中提供了java.util.concurrent(简称JUC)包,在此包中定义了并发编程中很常用 的工具,比如:线程池、阻塞队列、同步器、原子类等等。JUC是 JSR 166 标准规范的一个实现,JSR 166 以及 JUC 包的作者是同一个人 Doug Lea。Java中对CAS的实现。原创 2024-02-04 14:26:39 · 784 阅读 · 0 评论 -
volatile源码解析【解决可见性(依据内存屏障)有序性(依据happens-befor)】
转自 极客时间。原创 2024-02-03 14:37:57 · 353 阅读 · 0 评论 -
synchronized【如何保证原子性、可见性、有序性】【如何实现原子性 原理解析】【什么是Monitor】【什么是锁优化】
转自 极客时间原创 2024-02-03 14:20:43 · 361 阅读 · 0 评论 -
多线程有三个必须要保证的特性,才能正常运行(三个特性是:有序性,可见性,原子性)JMM的作用就是保证这三个特征
由于CPU和内存的速度不同,所以要在他们中间加了一个缓存保证效率。但是呢多个缓存之间可能存在缓存的数据不一致,这就是可见性还有例子read load write三个操作必须顺序执行,不能中断原创 2024-02-03 14:00:49 · 337 阅读 · 0 评论 -
Java线程是怎么实现run方法的执行的呢?【 多线程在JVM中的实现原理剖析】
在JVM首次加载Thread类的时候,在Thread类的静态初始化块中,调用了native registerNatives方法,它对应的Jni方法就是上面的Java_java_lang_Thread_registerNatives方法,就是在这里完成了state0和JVM_StartThread的绑定。开始执行操作系统线程。至此,操作系统线程为就绪状态,等待被CPU选中运行时,就会调用执行入口函数java_start,调用Java线程的run方法,至此Java线程也就同时运行起来了。原创 2024-02-03 13:04:15 · 1194 阅读 · 0 评论