
原子类 及 ThreadLocal
文章平均质量分 89
在编程领域里,原子性意味着“一组操作要么全都操作成功,要么全都失败,不能只操作成功其中的一部分”。而 java.util.concurrent.atomic 下的类,就是具有原子性的类,可以原子性地执行添加、递增、递减等操作。
Ssssongsmith 奕飞
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
58-Java 中的原子操作有哪些注意事项?
什么是原子性和原子操作 在编程中,具备原子性的操作被称为原子操作。原子操作是指一系列的操作,要么全部发生,要么全部不发生,不会出现执行一半就终止的情况。 比如转账行为就是一个原子操作,该过程包含扣除余额、银行系统生成转账记录、对方余额增加等一系列操作。虽然整个过程包含多个操作,但由于这一系列操作被合并成一个原子操作,所以它们要么全部执行成功,要么全部不执行,不会出现执行一半的情况。比如我的余额已经扣除,但是对方的余额却不增加,这种情况是不会出现的,所以说转账行为是具备原子性的。而具有原子性的原子操作,天然具原创 2021-02-04 15:39:26 · 261 阅读 · 7 评论 -
47-内存泄漏——为何每次用完 ThreadLocal 都要调用 remove()?
首先,我们要知道这个事情和内存泄漏有关,所以就让我们先来看一下什么是内存泄漏。 什么是内存泄漏 内存泄漏指的是,当某一个对象不再有用的时候,占用的内存却不能被回收,这就叫作内存泄漏。 因为通常情况下,如果一个对象不再有用,那么我们的垃圾回收器 GC,就应该把这部分内存给清理掉。这样的话,就可以让这部分内存后续重新分配到其他的地方去使用;否则,如果对象没有用,但一直不能被回收,这样的垃圾对象如果积累的越来越多,则会导致我们可用的内存越来越少,最后发生内存不够用的 OOM 错误。 下面我们来分析一下,在 Thr原创 2021-01-17 23:01:48 · 1001 阅读 · 6 评论 -
46-多个 ThreadLocal 在 Thread 中的 threadlocals 里是怎么存储的?
Thread、 ThreadLocal 及 ThreadLocalMap 三者之间的关系 在讲解本课时之前,先要搞清楚 Thread、 ThreadLocal 及 ThreadLocalMap 三者之间的关系。我们用最直观、最容易理解的图画的方式来看看它们三者的关系: 我们看到最左下角的 Thread 1,这是一个线程,它的箭头指向了 ThreadLocalMap 1,其要表达的意思是,每个 Thread 对象中都持有一个 ThreadLocalMap 类型的成员变量,在这里 Thread 1 所拥有的原创 2021-01-16 22:25:11 · 1440 阅读 · 8 评论 -
45-ThreadLocal 是用来解决共享资源的多线程访问的问题吗?
问题:ThreadLocal 是不是用来解决共享资源的多线程访问的。 这是一个常见的面试问题,如果被问到了 ThreadLocal,则有可能在你介绍完它的作用、注意点等内容之后,再问你:ThreadLocal 是不是用来解决共享资源的多线程访问的呢?假如遇到了这样的问题,其思路一定要清晰。这里我给出一个参考答案。 面试时被问到应如何回答 这道题的答案很明确——不是,ThreadLocal 并不是用来解决共享资源问题的。虽然 ThreadLocal 确实可以用于解决多线程情况下的线程安全问题,但其资源并不是共原创 2021-01-15 21:52:51 · 206 阅读 · 4 评论 -
44-ThreadLocal 适合用在哪些实际生产的场景中?
我们在学习一个工具之前,首先应该知道这个工具的作用,能带来哪些好处,而不是一上来就闷头进入工具的 API、用法等,否则就算我们把某个工具的用法学会了,也不知道应该在什么场景下使用。所以,我们先来看看究竟哪些场景下需要用到 ThreadLocal。 在通常的业务开发中,ThreadLocal 有两种典型的使用场景。 场景1,ThreadLocal 用作保存每个线程独享的对象,为每个线程都创建一个副本,这样每个线程都可以修改自己所拥有的副本, 而不会影响其他线程的副本,确保了线程安全。 场景2,ThreadLo原创 2021-01-13 23:48:39 · 271 阅读 · 11 评论 -
41-原子类和 volatile 有什么异同?
案例说明 volatile 和原子类的异同 我们首先看一个案例。如图所示,我们有两个线程。 在图中左上角可以看出,有一个公共的 boolean flag 标记位,最开始赋值为 true,然后线程 2 会进入一个 while 循环,并且根据这个 flag 也就是标记位的值来决定是否继续执行或着退出。 最开始由于 flag 的值是 true,所以首先会在这里执行一定时期的循环。然后假设在某一时刻,线程 1 把这个 flag 的值改为 false 了,它所希望的是,线程 2 看到这个变化后停止运行。 但是这样做原创 2021-01-09 22:49:47 · 236 阅读 · 9 评论 -
40-AtomicInteger 在高并发下性能不好,如何解决?为什么?
知道在 JDK1.5 中新增了并发情况下使用的 Integer/Long 所对应的原子类 AtomicInteger 和 AtomicLong。 在并发的场景下,如果我们需要实现计数器,可以利用 AtomicInteger 和 AtomicLong,这样一来,就可以避免加锁和复杂的代码逻辑,有了它们之后,我们只需要执行对应的封装好的方法,例如对这两个变量进行原子的增操作或原子的减操作,就可以满足大部分业务场景的需求。 不过,虽然它们很好用,但是如果你的业务场景是并发量很大的,那么你也会发现,这两个原子类实际原创 2021-01-08 22:40:42 · 299 阅读 · 0 评论