
并发编程
文章平均质量分 82
并发编程
码上得天下
这个作者很懒,什么都没留下…
展开
-
volatile怎么通过内存屏障保证可见性和有序性?
小陈:老王,上一篇你引出了volatile底层是通过内存屏障来解决可见性和有序性问题的。首先我想问一下什么是内存屏障?内存屏障啊,本质上也是一种指令,只不过它具有屏障的作用而已。小陈:额,这怎么说...老王:首先内存屏障是一种指令,无论是在JAVA内存模型还是CPU层次,都是有具体的指令对应的,是一种特殊的指令。小陈:嗯嗯,它是一种特殊的指令。还是不明白......小陈:然后呢?老王:然后这种指令具有屏障的作用所谓屏障,也就是类似关卡,类似栅栏,具有隔离的作用。转载 2024-04-16 22:28:38 · 125 阅读 · 0 评论 -
java的Thread所占内存是jvm中哪里的?
说到线程,我们往往想到的是线程安全、线程池,很少会去考虑线程的内存。那么一个线程占用多大的内存?占用哪里的内存呢?jdk1.4默认的单个线程是占用256k的内存jdk1.5+默认的单个线程是占用1M的内存可以通过-Xss参数设定,一般默认就好这TM还用问?java线程当然是占用jvm的内存啊!转载 2024-02-23 13:33:58 · 314 阅读 · 0 评论 -
ForkJoin从原理设计到使用图解
从JDK1.7开始,Java提供ForkJoin框架用于并行执行任务,它的思想就是讲一个大任务分割成若干小任务,最终汇总每个小任务的结果得到这个大任务的结果。转载 2023-06-09 13:06:16 · 272 阅读 · 0 评论 -
源码分析-SynchronousQueue
SynchronousQueue作为的时候,对于每一个take的线程会为止,反之亦然。在SynchronousQueue。所以类似peek操作或者操作也是无效的,元素只能通过put类操作或者take类操作才有效。通常队列的是当前。如果没有线程阻塞在该队列则poll会返回null。从Collection的视角来看SynchronousQueue表现为一个。SynchronousQueue相似于使用CSP和Ada算法(不知道怎么具体指什么算法),他非常适合做。转载 2023-06-08 21:02:35 · 196 阅读 · 0 评论 -
并发编程之Exchanger原理与使用
在JUC包中,除了一些常用的或者说常见的并发工具类(ReentrantLock,CountDownLatch,CyclicBarrier,Semaphore)等,还有一个不常用的线程同步器类 —— Exchanger。Exchanger是适用在两个线程之间数据交换的并发工具类,它的作用是找到一个同步点,当两个线程都执行到了同步点(exchange方法)之后(有一个没有执行到就一直等待,也可以设置等待超时时间),就将自身线程的数据与对方交换。转载 2023-06-08 13:53:53 · 1537 阅读 · 0 评论 -
AQS源码分析
我们先来看看重入锁的场景代码// 共享变量// 操作共享变量的方法// 为了演示效果 休眠一下子try {count ++;// 调用了另外一个方法。decr();}finally {try {// 重入锁count--;i++) {首先大家考虑这段代码会死锁吗?大家给我个回复,我看看大家的理解的怎么样好了,有说会死锁的,有说不会,其实这儿是不会死锁的,而且结果就是0.为什么呢?转载 2023-05-22 16:11:58 · 199 阅读 · 0 评论 -
synchronized修饰静态方法与实例方法
一、synchronized修饰实例方法:synchronized修饰实例方法,实际上是对调用该方法的对象加锁。场景1:同一实例对象在两个线程中分别调用该对象的两个同步实例方法。转载 2023-04-04 14:28:31 · 937 阅读 · 0 评论 -
Java多线程按着指定顺序执行
举例:在线程thread2中,加上一句thread1.join(),其意义在于,当前线程2运行到此行代码时会进入阻塞状态,直到线程thread1执行完毕后,线程thread2才会继续运行,这就保证了线程thread1与线程thread2的运行顺序。简单说一下子线程与主线程的区别,子线程指的是发生在Thread内部的代码,主线程指的是发生在main函数中的代码,我们可以在main函数中通过join()方法让主线程阻塞等待以达到指定顺序执行的目的。转载 2023-03-22 11:53:05 · 122 阅读 · 0 评论 -
线程池+内存队列处理任务
1,初始化线程池@Componentpublic class InitListener { @PostConstruct public void init() { // 初始化工作线程池和内存队列 RequestProcessorThreadPool.init(); }}2.请求处理线程池package org.concu.lis;import java.util.concurrent.ArrayBlockingQueue;转载 2021-11-24 18:01:06 · 459 阅读 · 0 评论 -
三个线程顺序打印ABC10次实现方案总结
方式一:package org.concu;import java.util.concurrent.Semaphore;public class ABC3 { private static Semaphore A = new Semaphore(1); private static Semaphore B = new Semaphore(1); private static Semaphore C = new Semaphore(1); static clas原创 2021-11-18 17:54:00 · 1136 阅读 · 0 评论 -
线程池大小 + 线程数量到底设置多少?
可能很多人都看到过一个线程数设置的理论:CPU 密集型的程序 - 核心数 + 1 I/O 密集型的程序 - 核心数 * 2真的有人按照这个理论规划线程数?线程数和CPU利用率的小测试抛开一些操作系统,计算机原理不谈,说一个基本的理论(不用纠结是否严谨,只为好理解):一个CPU核心,单位时间内只能执行一个线程的指令 ** 那么理论上,我一个线程只需要不停的执行指令,就可以跑满一个核心的利用率。来写个死循环空跑的例子验证一下:测试环境:AMD Ryzen 5 3600, 6 - Core转载 2021-10-20 19:10:20 · 781 阅读 · 0 评论 -
线程池监控
package org.example.thread;import lombok.extern.slf4j.Slf4j;import java.util.concurrent.*;/** * Description: 线程池工厂 */@Slf4jpublic class ThreadPoolFactory { /** * 线程池1 */ private static ThreadPoolProxy demoF = new ThreadPoolPro.原创 2021-10-13 16:12:14 · 285 阅读 · 0 评论 -
什么是线程中断?
下面的这断代码大家应该再熟悉不过了,线程休眠需要捕获或者抛出线程中断异常,也就是你在睡觉的时候突然有个人冲进来把你吵醒了。try { Thread.sleep(3000);} catch (InterruptedException e) { e.printStackTrace();}此时线程被打断后,代码会继续运行或者抛出异常结束运行,这并不是我们需要的中断线程的作用。到底是什么是线程中断?线程中断即线程运行过程中被其他线程给打断了,它与 stop 最大的区别是:stop 是由系转载 2021-10-11 10:45:01 · 2354 阅读 · 0 评论 -
Java线程池实现原理及其在美团业务中的实践
随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池:ThreadPoolExecutor类,帮助开发人员管理线程并方便地执行并行任务。了解并合理使用线程池,是一个开发人员必修的基本功。本文开篇简述线程池概念和用途,接着结合线程池的源码,帮助读者领略线程池的设计思路,最后回归实践,通过案例讲述使用线程池遇到的问题,并给出了一种动态化线程池解决方案。一、写在前面1.1 线程池是什么线程池(Thread转载 2021-09-08 15:52:45 · 98 阅读 · 0 评论 -
并发编程框架----disruptor框架(三)
并发框架Disruptor译文Martin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易。这个系统是建立在JVM平台上,其核心是一个业务逻辑处理器,它能够在一个线程里每秒处理6百万订单。业务逻辑处理器完全是运行在内存中,使用事件源驱动方式。业务逻辑处理器的核心是Disruptor。Disruptor它是一个开源的并发框架,并获得2011 Duke’s程序框架创新奖,能够在无锁的情况下实现网络的Queu...转载 2021-09-08 14:44:18 · 335 阅读 · 0 评论 -
并发编程框架----disruptor框架(二)
一简介Martin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易。这个系统是建立在JVM平台上,其核心是一个业务逻辑处理器,它能够在一个线程里每秒处理6百万订单。业务逻辑处理器完全是运行在内存中,使用事件源驱动方式。业务逻辑处理器的核心是Disruptor。Disruptor它是一个开源的并发框架,并获得2011 Duke’s 程序框架创新奖,能够在无锁的情况下实现网络的Queue并发操作。Disruptor是一.转载 2021-09-08 14:39:14 · 536 阅读 · 0 评论 -
并发编程框架----disruptor框架(一)
背景Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后,获得了业界关注。2011年,企业应用软件专家Martin Fowler专门撰写长文介绍。同年它还获得了Oracle官方的Duke大奖。目前,包括Apache Storm、Camel、Log4j 2在内的很多知名项目都应用了Disruptor以获取高性能。在转载 2021-09-08 10:42:00 · 5207 阅读 · 0 评论 -
一个线程池中的线程异常了,那么线程池会怎么处理这个线程?
需要说明一下,文中讨论的线程池都是Executors线程池。对于Executors线程池我可以说是烂熟于心,因为工作中用的比较的多,阅读过其源码。也是我作为面试官时必问的几个范围之一,比如以下问题:了解JDK Executors线程池吗?知道JDK提供了哪些默认的实现吗?看过阿里巴巴java开发手册吗?知道为啥不允许使用默认的实现吗?你们没有用默认的吧?那来介绍一下你们自定义线程池的几个常用参数呗?你这个几个参数的值是怎么得来的呀?算出来的?怎么算出来的?线程池里面的任务是IO密集转载 2021-08-25 11:41:53 · 798 阅读 · 0 评论 -
盘一盘 synchronized (二)—— 偏向锁批量重偏向与批量撤销
在本文讲解之前,先来简单了解一下为什么会有批量重偏向和批量撤销。批量重偏向:当一个线程创建了大量对象并执行了初始的同步操作,后来另一个线程也来将这些对象作为锁对象进行操作,会导偏向锁重偏向的操作。批量撤销:在多线程竞争剧烈的情况下,使用偏向锁将会降低效率,于是乎产生了批量撤销机制。JVM的默认参数值通过JVM的默认参数值,找一找批量重偏向和批量撤销的阈值。设置JVM参数-XX:+PrintFlagsFinal,在项目启动时即可输出JVM的默认参数值intx Bias...转载 2021-05-17 14:32:35 · 633 阅读 · 0 评论 -
盘一盘 synchronized (一)—— 从打印Java对象头说起
盘一盘 synchronized (二)—— 偏向锁批量重偏向与批量撤销转载 2021-05-17 14:20:27 · 135 阅读 · 0 评论 -
synchronized实现原理和锁升级过程
https://baijiahao.baidu.com/s?id=1654344500475304827&wfr=spider&for=pc转载 2021-05-17 11:48:04 · 337 阅读 · 0 评论 -
InheritableThreadLocal使用详解
引子public class InheritableThreadLocalDemo { private static ThreadLocal<String> threadLocal = new ThreadLocal<>(); public static void main(String[] args) { threadLocal.set("mainThread"); System.out.println("value:"+t转载 2021-05-07 14:25:01 · 339 阅读 · 0 评论 -
同步工具——Exchanger
一、Exchanger简介Exchanger——交换器,是JDK1.5时引入的一个同步器,从字面上就可以看出,这个类的主要作用是交换数据。Exchanger有点类似于CyclicBarrier,我们知道CyclicBarrier是一个栅栏,到达栅栏的线程需要等待其它一定数量的线程到达后,才能通过栅栏。Exchanger可以看成是一个双向栅栏,如下图:Thread1线程到达栅栏后,会首先观察有没其它线程已经到达栅栏,如果没有就会等待,如果已经有其它线程(Thread2)已经到达了,就会以成转载 2021-05-07 11:41:31 · 620 阅读 · 0 评论 -
Java可重入锁如何避免死锁
public class Widget { public synchronized void doSomething(){ // do something }}public class LoggingWidget extends Widget { public synchronized void doSomething() { s...原创 2020-04-17 11:50:14 · 345 阅读 · 2 评论 -
ThreadPoolExecutor源码分析
一、线程和任务的概念首先区分概念,任务和线程。可以简单理解为任务为Runnable,线程为Thread。ThreadPoolExecutor内部维持的是线程池,因为创建线程比较耗时耗资源。而内部维护任务使用的是BlockingQueue。二、ThreadPoolExecutor源码2.1 ctl变量 private final AtomicInteger ctl = ...转载 2020-04-16 21:03:45 · 775 阅读 · 0 评论 -
从源码角度彻底理解ReentrantLock(重入锁)
从源码角度彻底理解ReentrantLock(重入锁)CLH队列,先进先出,双向链表,尾部追加,头部出列。转载 2020-04-09 20:46:48 · 363 阅读 · 0 评论 -
分析JUC源码必须了解CAS
什么是CAS?JDK里Unsafe类的一个API:compareAndSwap,即比较和交换,它是一个native方法,底层C++实现,包括compareAndSwapObject,compareAndSwapInt和compareAndSwapLong,方法有四个参数,对象,待修改的属性在对象里的偏移量A(可以理解为获取属性的get方法或者指针),期望值B,修改后的值V;方法的执行流程:先通过A...原创 2020-04-09 20:38:15 · 251 阅读 · 0 评论 -
ThreadLocal详解
ThreadLocal缺陷以及处理ThreadLocal详解转载 2020-04-17 21:00:58 · 280 阅读 · 0 评论 -
深入分析AQS实现原理
https://segmentfault.com/a/1190000017372067转载 2020-04-09 22:42:13 · 730 阅读 · 0 评论