
Java并发
文章平均质量分 80
Shockang
我是Shockang,AI进化比我喝咖啡还快,程序员危机UP!不想被取代,就抱紧读书救命稻草,还能一起边学边吐槽,欢迎来玩!
展开
-
100个问题搞懂Java并发
写在前面100个问题搞定Java虚拟机100个问题搞定大数据理论体系1000个问题搞定大数据技术体系目录结构什么叫线程安全?同步和异步有什么区别?并发和并行有什么区别?死锁、活锁和饥饿是什么意思?Java 中线程状态有哪些?Java中实现多线程的方法有哪些?JVM 中可以创建多少个线程?Java中有哪些方法可以终止线程运行?如何理解 Java 的线程中断机制?线程的等待(wait)和通知(notify)是什么情况?线程的挂起(suspend)和继续执行(resume)是什么情原创 2021-06-08 08:55:26 · 13461 阅读 · 22 评论 -
一篇文章熟悉 Java 高性能队列——Disruptor
Java Disruptor框架是一个高性能、低延迟的并发编程框架,它主要通过使用环形缓冲区和事件发布-订阅模式来实现高效的数据传递和处理。Disruptor框架提供了简单易用的API,使得开发人员可以轻松地使用它。Disruptor框架适用于高性能、低延迟的数据处理场景,例如金融交易系统、游戏服务器、高速缓存等。原创 2023-03-05 22:06:23 · 1281 阅读 · 0 评论 -
你知道工作窃取算法吗?你知道 Java 中的 fork/join 框架吗?
本文我们将讨论 Java 中工作窃取的概念。在 JDK7 中引入了工作窃取,旨在减少多线程应用程序中的竞争。这是使用 fork/join 框架完成的。在 fork/join 框架中,问题或任务被递归分解为子任务。然后单独解决子任务,子结果组合成结果。分解任务在线程池提供的工作线程的帮助下解决。每个工作线程都有它负责的子任务。这些存储在双端队列(deques)中。每个工作线程通过不断从 d...原创 2022-07-10 00:28:33 · 582 阅读 · 0 评论 -
一篇文章学会使用 CompletableFuture(JDK9)
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文CompletableFuture 是 Java8 新增的一个超大型工具类。为什么说它大呢?因为它实现了 Future 接口,而更重要的是,它也实现了 CompletionStage 接口。CompletionStage 接口也是 Java8 中新增的,它拥有多达约 40 种方法!是的,你没有看错,这看起原创 2021-11-14 21:56:14 · 6830 阅读 · 7 评论 -
一篇文章搞懂 SynchronousQueue
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文WHAT在对 Executors 的介绍中,提到了一个非常特殊的等待队列 SynchronousQueue详情请见我的这篇博客——Executors 源码解析(JDK8)SynchronousQueue 的容量为 0 ,任何一个对 SynchronousQueue 的写需要等待一个对 Synchrono原创 2021-11-14 11:03:59 · 6577 阅读 · 5 评论 -
一篇文章搞懂 ThreadLocal
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文ThreadLocal 如何保证这些对象只被当前线程访问呢?下面让我们一起深入 ThreadLocal 的内部实现。我们需要关注的自然是 ThreadLocal 的 set() 方法和 get() 方法。set先从 set() 方法说起: /** * Sets the current原创 2021-11-14 01:36:48 · 6551 阅读 · 4 评论 -
一篇文章搞懂 ConcurrentSkipListMap
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文跳表在 JDK 的并发包中,除常用的哈希表外,还实现了一种有趣的数据结构一一跳表。跳表是一种可以用来快速查找的数据结构,有点类似于平衡树。它们都可以对元素进行快速査找。但一个重要的区别是:对平衡树的插入和删除往往很可能导致平衡树进行一次全局的调整,而对跳表的插入和删除只需要对整个数据结构的局部进行操作即可原创 2021-11-13 15:04:15 · 7118 阅读 · 4 评论 -
一篇文章搞懂 DelayQueue
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文WHATDelayQueue 是一个无界阻塞队列( BlockingQueue ),用于放置实现了 Delayed 接口的对象,其中的对象只能在其到期时才能从队列中取走。关于 BlockingQueue 请参考我的博客——BlockingQueue 源码解析(JDK8)这种队列是有序的,因此队首对象的延原创 2021-11-13 14:22:55 · 6085 阅读 · 5 评论 -
ConcurrentLinkedQueue 源码解析(JDK8)
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文WHAT队列 Queue 是常用的数据结构之一。在 JDK 中提供了一个 ConcurrentLinkedQueue 类用来实现高并发的队列。从名字可以看到,这个队列使用链表作为其数据结构。有关 ConcurrentLinkedQueue 类的性能测试大家可以自行尝试,这里限于篇幅就不再给出性能测试的代码原创 2021-11-13 11:48:20 · 5970 阅读 · 4 评论 -
你了解 ConcurrentModificationException 吗?
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文WHYJDK 中很多容器类在面对复合操作会存在问题,无论在直接迭代还是在 Java 5.0 引人的 for - each 循环语法中,对容器类进行迭代的标准方式都是使用 Iterator ,然而,如果有其他线程并发地修改容器,那么即使是使用迭代器也无法避免在迭代期间对容器加锁。在设计同步容器类的迭代器时并没有原创 2021-11-13 10:52:03 · 6054 阅读 · 7 评论 -
BlockingQueue 源码解析(JDK8)
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文类注释package java.util.concurrent;import java.util.Collection;import java.util.Queue;/** * A {@link java.util.Queue} that additionally supports operatio原创 2021-11-11 23:15:00 · 6214 阅读 · 4 评论 -
一篇文章搞懂 CopyOnWriteArrayList
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文WHY在很多应用场景中,读操作可能会远远大于写操作。比如,有些系统级别的信息,往往只需要加载或者修改很少的次数,但是会被系统内所有模块频繁访问。对于这种场景,我们最希望看到的就是读操作可以尽可能地快,而写即使慢一些也没有太大关系。由于读操作根本不会修改原有的数据,因此对于每次读取都进行加锁其实是一种资源浪原创 2021-11-11 22:26:39 · 6406 阅读 · 5 评论 -
你了解 Guava 中有哪些线程池的扩展内容吗?
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文1 .特殊的 DirectExecutor 线程池在 MoreExecutors 中,提供了一个简单但是非常重要的线程池实现,即 DirectExecutor 线程池。DirectExecutor 线程池很简单,它并没有真的创建或者使用额外线程,它总是将任务在当前线程中直接执行。也许你会觉得很奇怪,为什么需原创 2021-11-11 21:51:41 · 7241 阅读 · 7 评论 -
一篇文章搞懂 CompletionService
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文WHY如果向 Executor 提交了一组计算任务,并且希望在计算完成后获得结果,那么可以保留与每个任务关联的 Future ,然后反复使用 get 方法,同时将参数 timeout 指定为 0 ,从而通过轮询来判断任务是否完成。这种方法虽然可行,但却有些繁琐。幸运的是,还有一种更好的方法:完成服务( C原创 2021-11-10 22:52:29 · 6088 阅读 · 10 评论 -
一篇文章搞懂 Timer
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文Timer 是什么?Timer 类负责管理延迟任务(“在 100ms 后执行该任务”)以及周期任务(“每 10ms 执行次该任务”)。Timer 的两大缺陷然而, Timer 存在一些缺陷,因此应该考虑使用 ScheduledThreadPoolExecutor 来代替它。可以通过 ScheduledTh原创 2021-11-10 22:21:02 · 6023 阅读 · 8 评论 -
线程池如何打印堆栈信息?
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文简单的例子先从一个简单的例子入手,首先,我们有一个 Runnable 接口,它用来计算两个数的商。public class DivTask implements Runnable { int a,b; public DivTask(int a,int b){ this.a=a;原创 2021-11-10 22:03:36 · 7483 阅读 · 6 评论 -
UncaughtExceptionHandler 是什么?线程池如何处理异常?
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文UncaughtExceptionHandler在 Thread API 中提供了 UncaughtExceptionHandler ,它能检测出某个线程由于未捕获的异常而终结的情况,能有效地防止线程泄漏问题当一个线程由于未捕获异常而退出时, JVM 会把这个事件报告给应用程序提供的 UncaughtExcep原创 2021-11-10 21:43:06 · 9329 阅读 · 8 评论 -
一篇文章搞懂 ThreadPoolExecutor
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文构造函数先来看一下 ThreadPoolExecutor 类最重要的构造函数:public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,原创 2021-11-09 22:41:05 · 6556 阅读 · 6 评论 -
Executors 源码解析(JDK8)
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文类注释/** * Factory and utility methods for {@link Executor}, {@link * ExecutorService}, {@link ScheduledExecutorService}, {@link * ThreadFactory}, and {@l原创 2021-11-08 22:44:27 · 6268 阅读 · 5 评论 -
如何对请求进行限流?
Guava 是 Google 下的一个核心库,提供了一大批设计精良、使用方便的工具类。许多 Java 项目都使用 Guava 作为其基础工具库来提升开发效率,我们可以认为 Guava 是 JDK 标准库的重要补充。RateLimiter在这里,将给大家介绍 Guava 中的一款限流工具原创 2021-11-08 21:45:58 · 6772 阅读 · 7 评论 -
一篇文章全面掌握 Java 中的锁概念
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文公平锁 / 非公平锁公平锁公平锁是指多个线程按照申请锁的顺序来获取锁。就和人排队一样,对于申请锁的线程是公平的,先到先得。非公平锁非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,会造成优先级反转或者饥饿现象。synchronized原创 2021-10-14 22:55:51 · 5948 阅读 · 5 评论 -
结合 JDK 源码学习提高锁性能的技巧
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文1、减少锁持有时间对于使用锁进行并发控制的应用程序而言,在锁竞争过程中,单个线程对锁的持有时间与系统性能有着直接的关系。如果线程持有锁的时间越长,那么相对地,锁的竟争程度也就越激烈。可以想象一下,如果要求 100 个人各自填写自己的身份信息,但是只给他们一支笔,那么如果每个人拿着笔的时间都很长,总体所花的时原创 2021-10-11 22:46:17 · 5980 阅读 · 4 评论 -
结合 JDK8 源码深入分析 AQS 和 ReentrantLock 的实现原理
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文AQS 的设计初衷Doug Lea 曾经介绍过 AQS 的设计初衷。Doug Lea,这个不用多说,大家可以搜一搜 JDK 的源码,JDK5 的并发包就是他开发的,真 Java 大神。从原理上,一种同步结构往往是可以利用其他的结构实现的,但是,对某种同步结构的倾向,会导致复杂、晦涩的实现逻辑,所以,他选原创 2021-09-19 21:51:46 · 6151 阅读 · 10 评论 -
LockSupport 是什么?怎么用?
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文LockSupport 是一个非常方便实用的线程阻塞工具,它可以在线程内任意位置让线程阻塞。与 Thread.suspend() 方法相比,它弥补了由于 resume() 方法发生导致线程无法继续执行的情况。关于 suspend 和 resume 请参考我的博客——线程的挂起(suspend)和继续执行(r原创 2021-07-17 11:22:14 · 7048 阅读 · 6 评论 -
ReadWriteLock 是什么?怎么用?
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文ReadWriteLock 是 JDK5 中提供的读写分离锁。读写分离锁可以有效地帮助减少锁竞争, 提升系统性能。用锁分离的机制来提升性能非常容易理解,比如线程 A1 、 A2 、 A3 进行写操作, B1 、 B2 、 B3 进行读操作,如果使用重入锁或者内部锁,从理论上说所有读之间、读与写之间、写和写之间原创 2021-07-07 22:45:24 · 32515 阅读 · 18 评论 -
CyclicBarrier 是什么?怎么用?
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文CyclicBarrier 是另外一种多线程并发控制工具。和 CountDownLatch 非常类似,它也可以实现线程间的计数等待,但它的功能比 CountDownLatch 更加复杂且强大。CyclicBarrier 可以理解为循环栅栏。栅栏就是一种障碍物,比如,通常在私人宅邸的周围就可以围上一圈栅栏,阻原创 2021-07-07 22:30:56 · 37963 阅读 · 25 评论 -
CountDownLatch 是什么?怎么用?
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文CountDownLatch 是一个非常实用的多线程控制工具类。“CountDown”在英文中意为倒计数, Latch 意为门闩的意思。这里简单地称之为倒计数器。在这里,门闩的含义是把门锁起来,不让里面的线程跑出来。因此,这个工具通常用来控制线程等待,它可以让某一个线程等待直到倒计数结束,再开始执行。对原创 2021-07-07 21:46:28 · 33031 阅读 · 22 评论 -
Semaphore 是什么?怎么用?
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文信号量为多线程协作提供了更为强大的控制方法。从广义上说,信号量是对锁的扩展。无论是内部锁 synchronized 还是重入锁 ReentrantLock ,一次都只允许一个线程访问一个资源,而信号量却可以指定多个线程,同时访问某一个资源。信号量主要提供了以下构造函数public Semaphore(in原创 2021-07-07 21:34:55 · 31472 阅读 · 18 评论 -
Condition 是什么?怎么用?
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文如果大家理解了 Object.wait() 方法和 Object.notify() 方法,就能很容易地理解 Condition 对象了。它与 wait() 方法和 notify() 方法的作用是大致相同的。关于 wait 和 notify 请参考我的博客——但是 wait() 方法和 notify()原创 2021-07-04 00:10:06 · 32733 阅读 · 19 评论 -
ReentrantLock 是什么?怎么用?
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文重入锁可以替代关键字 synchronized 。在 JDK5.0 的早期版本中,重入锁的性能远远优于关键字 synchronized ,但从 JDK6.0 开始, JDK 在关键字 synchronized 上做了大量的优化,使得两者的性能差距并不大。重入锁使用 ReentrantLock 实现1、重入原创 2021-07-03 22:33:07 · 31237 阅读 · 25 评论 -
finalize 真的一点用没有吗?
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文内存清理程序员都了解初始化的重要性,但通常会忽略清理的重要性。毕竟,谁会去清理一个 int 呢?但是使用完一个对象就不管它并非总是安全的。Java 中有垃圾回收器回收无用对象占用的内存。但现在考虑一种特殊情况:你创建的对象不是通过 new 来分配内存的,而垃圾回收器只知道如何释放用 new 创建的对象的原创 2021-07-02 19:58:57 · 6811 阅读 · 13 评论 -
线程的等待线程结束(join)和谦让(yield)是什么情况?
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文为什么需要 join?在很多情况下,线程之间的协作和人与人之间的协作非常类似。一种非常常见的合作方式就是分工合作。以我们非常熟悉的软件开发为例,在一个项目进行时,总是应该有几位号称是“需求分析师”的同事,先对系统的需求和功能点进行整理和总结,以书面形式给出份需求说明或者类似的参考文档,然后,软件设计师、研发原创 2021-07-01 21:56:29 · 31232 阅读 · 14 评论 -
线程的挂起(suspend)和继续执行(resume)是什么情况?
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文如果你阅读 JDK 有关 Thread 类的 API 文档,可能还会发现两个看起来非常有用的接口,即线程挂起( suspend )和继续执行( resume )。这两个操作是一对相反的操作,被挂起的线程,必须要等到 resume 方法操作后,才能继续指定。乍看之下,这对操作就像 Thread.stop() 方原创 2021-07-01 21:29:23 · 33332 阅读 · 14 评论 -
如何理解 Java 的线程中断机制?
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文在Java中,线程中断是一种重要的线程协作机制。从表面上理解,中断就是让目标线程停止执行的意思,实际上并非完全如此。在专栏前面我们提到了 stop() 方法停止线程的坏处,详情请见——Java中有哪些方法可以终止线程运行?在 JDK 中是否有提供完善的支持线程退出的能力呢?答案是肯定的,那就是线程中断。严格原创 2021-07-01 20:04:01 · 7746 阅读 · 22 评论 -
结合JDK源码图文详解 wait 和 notify 的工作原理
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文为了支持多线程之间的协作,JDK 提供了两个非常重要的接口:线程等待 wait() 方法和通知 notify() 方法。为什么这两个方法并不是在 Thread 类中的,而是在 Object 类里面?一方面意味着任何对象都可以调用这两个方法。另一方面, 无论是 wait() 方法或者 notify() 方法原创 2021-06-08 23:03:12 · 38436 阅读 · 26 评论 -
Java 的守护线程是什么情况?
前言本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java并发正文守护线程如果你希望创建一个线程来执行一些辅助工作,但又不希望这个线程阻碍JVM的关闭。在这种情况下就需要使用守护线程(Daemon Thread)。守护线程是一种特殊的线程,就和它的名字一样,它是系统的守护者,在后台默默地完成一些系统性的服务,比如垃圾回收线程、JIT线程就可以理解为守护线程。用户线程与之原创 2021-06-08 21:22:50 · 6767 阅读 · 13 评论 -
volatile 的实现原理是什么?
前言本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java虚拟机正文使用 volatile 有三大理由字分裂(Word tearing)当你的 Java 数据类型足够大(在 Java 中 long 和 double 类型都是 64 位),写入变量的过程分两步进行,就会发生 Word tearing(字分裂)情况。JWM 被允许将 64 位数量的读写作为两个单独的 32原创 2021-06-07 22:58:04 · 12935 阅读 · 28 评论 -
Java虚拟机是怎么实现synchronized的?
前言本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和参考文献请见100个问题搞定Java虚拟机正文Java 虚拟机中 对 synchronized 关键字的实现,按照代价由高至低可分为重量级锁、轻量级锁和偏向锁三种。当 JVM 检测到不同的竞争状况时,会自动切换到适合的锁实现,这种切换就是锁的升级、降级。偏向锁JVM 会利用 CAS 操作,在对象头上的 Mark Word 部分设置线程 ID,以表示原创 2021-06-07 22:55:47 · 35023 阅读 · 21 评论 -
JVM 中可以创建多少个线程?
写在前面本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定Java并发解答 成百上千个,具体的与计算机本身性能和 JVM 配置有关。 比如可以使用-Xmx标志增加JVM的最大内存分配,可以使用-Xss标记减少每个线程栈分配的内存大小。补充JVM 常用调优参数参数说明补充-Xms初始堆内存大小,默认物理内存64/1-Xms = -XX:Initia原创 2021-04-17 22:10:50 · 7195 阅读 · 14 评论 -
什么叫线程安全?
写在前面本文隶属于专栏《100个问题搞定Java并发》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!本专栏目录结构和文献引用请见100个问题搞定Java并发解答当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。...原创 2021-04-14 23:52:16 · 6912 阅读 · 0 评论