![](https://img-blog.csdnimg.cn/20190918140129601.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
多线程
文章平均质量分 87
多线程并发,JUC包
Robinsyn_L
这个作者很懒,什么都没留下…
展开
-
Future、CompletionService、CompletableFuture介绍与对比
Future是JDK1.5 提供的接口,是用来以阻塞的方式获取线程异步执行完的结果。FutureTask 类是 Java 中 Future 接口的一个实现,同时也实现了 Runnable 接口。它用于表示异步计算的结果,允许一个任务在一个线程中计算结果,在另一个线程中获取计算的结果。// 创建一个固定大小的线程池 ExecutorService executorService = Executors . newFixedThreadPool(2);原创 2024-01-04 18:58:23 · 1297 阅读 · 3 评论 -
高并发下的计数——LongAdder
高并发下计数,一般最先想到的应该是AtomicLong/AtomicInt,AtomicXX能保证并发情况下计数的准确性,其内部通过CAS来解决并发安全性的问题。当有大量线程同时去更新一个变量,任意一个时间点只有一个线程能够成功,绝大部分的线程在尝试更新失败后,会通过自旋的方式再次进行尝试,这样严重占用了CPU的时间片,进而导致系统性能问题。LongAdder采用分段的方式,通过维护一个基准值base和 Cell 数组降低并发冲突的概率。原创 2023-03-28 23:11:09 · 292 阅读 · 0 评论 -
Java中Sychronized的锁升级
无锁状态下线程 A 初次执行到synchronized代码块的时候,锁对象变成偏向锁,执行完同步代码块后,线程并不会主动释放偏向锁,后续线程 A 再次访问同步代码时,不需要做任何的 check,直接执行(偏向于第一个获得它的线程),这样降低了获取锁的代价,提升了效率。无锁、偏向锁的 lock 标志位是一样的,即都是 01,无锁、偏向锁是靠字段 biased_lock 来区分的,0 代表没有使用偏向锁,1 代表启用了偏向锁。后续的竞争线程都会通过自旋来尝试获取锁,如果自旋成功那么锁的状态仍然是轻量级锁。原创 2023-03-27 18:36:28 · 366 阅读 · 0 评论 -
synchronized与Lock的异同
synchronized与Lock都能进行加锁,不过不同的是Synchronized 是Java的一个关键字,而Lock是java.util.concurrent.Locks 包下的一个接口,底下有不同的实现方式。当方法调用时,调用指令将会检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程将先获取monitor,获取成功之后才能执行方法体,方法执行完后再释放monitor。在 Java 中,静态代码块是在类加载时执行的,而类加载的过程是由类加载器负责的。原创 2023-03-26 22:08:14 · 194 阅读 · 0 评论 -
线程同步以及多线程通信方式
当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态,这就是线程同步。原创 2023-03-26 21:43:41 · 138 阅读 · 0 评论 -
Java并发包的灵魂AbstractQueuedSynchronizer
我们在写这个系列的时候提到了很多并发工具,比如ReentrantLock、Semaphore,在这些工具的实现里面都用了一个共同的基类,也就是这篇文章要介绍的AbstractQueuedSynchronizer(AQS)。AQS是一个用于构建锁、同步器、协作工具类的框架,提供了同步状态的原子管理、阻塞和唤醒线程以及队列的管理功能。原创 2022-09-06 16:59:48 · 466 阅读 · 0 评论 -
JUC系列之并发队列
前面在写JUC系列之线程池的使用的时候,构造线程池的时候有一个参数叫做工作队列,其实现就是不同的BlockQueue阻塞队列,在这里BlockQueue也是一种并发队列,本篇文章主要是介绍阻塞的并发队列。原创 2022-09-04 16:50:41 · 383 阅读 · 0 评论 -
JUC系列之CopyOnWrite容器
前面写了一篇从ConcurrentHashMap出发引发的一系列思考,这里再介绍一个并发容器,ConcurrentHashMap是通过cas和synchronized保证并发的,而CopyOnWrite系列容器是通过创建副本和ReentrantLock保证并发。原创 2022-09-04 00:11:47 · 203 阅读 · 0 评论 -
从ConcurrentHashMap出发引发的一系列思考
在做mit6.830时,关于数据库的全局目录catalog类持有一个线程安全的去保存数据库中每一张表。为了避免多个线程对数据库目录修改造成数据不一致的情况,是不能使用HashMap的,这是因为HashMap是线程不安全的。...原创 2022-08-07 16:24:03 · 1039 阅读 · 0 评论 -
ThreadLocal源码及其内存泄漏问题
ThreadLocal提供了线程的局部变量,该变量对其他线程而言是隔离的,每个线程都可以通过set()和get()来对这个局部变量进行操作,但不会和其他线程的局部变量进行冲突,实现了线程的数据隔离。Synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问,多线程同时操作共享变量并且能正确的输出结果;ThreadLocal是为每一个线程都提供了变量的副本,把共享变量变成线程私有了,每个线程都有独立的一个变量。ThreadLocal的实例和他的值仍然是放到在堆的。ThreadLoc原创 2022-08-29 23:53:09 · 547 阅读 · 0 评论 -
线程的创建方式与线程池的使用
前面几天忙着写论文好久没更新文章了,不能这么懈怠,还是得随时进行学习的反馈。虽然前面的坑还没填完,但我现在又准备开新坑了o( ̄︶ ̄)o。目前计划开个新专栏专门整理一下java.util.concurrent,Java并发包,也当做是复习,这一篇呢就是这个新系列的第一篇文章,话不多说,直接开冲!首先,如果我们直接使用JDK封装好的构造函数自动创建线程会发生什么,答案是可能由于使用无界工作队列导致任务堆积或者直接创建新的线程转发任务导致过多线程资源,发生内存溢出的问题。如果自定义合适的线程池呢?原创 2022-08-28 23:49:34 · 634 阅读 · 0 评论