![](https://img-blog.csdnimg.cn/20190918140053667.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
并发编程
文章平均质量分 72
并发编程
文晓武
专注搜索推荐问答推荐工程领域,涉及到的技术有:Java、ElasticSearch、SpringBoot、SpringCloud、Dubbo、Linux、Docker、Sql、Kafka、RabbitMQ、RocketMQ、MyBatis、XXl-Job、Zookeeper、Nginx、Redis、Tomcat、Git、SVN、Maven、K8S等,每周不定期更新精华文章!
展开
-
线上接口经常超时,我用线程池+ FutureTask解决了,YYDS
之前红包权益领取查询的接口超时了,因为有用户订购的权益有点多解决方案用线程池+ FutureTask将1个查询拆分成多个小查询 选择FutureTask是因为它具有仅执行1次run()方法的特性(即使有多次调用也只执行1次),避免了重复查询的可能。而且多任务异步执行也能提高接口响应速度。本文主要讲的是线程池搭配FutureTask异步执行的例子一、线程池+FutureTask执行多任务计算publicclassTest{//线程池最好作为全局变量,若作为局部变量记得用完后s...转载 2022-02-23 11:57:34 · 128 阅读 · 0 评论 -
Java多线程常见闭坑指南
image.png2.1. 线程池打爆机器首先,我们聊一个非常非常低级,但又产生了严重后果的多线程错误。通常,我们创建线程的方式有Thread,Runnable和线程池三种。随着Java1.8的普及,现在最常用的就是线程池方式。有一次,我们线上的服务器出现了僵死,就连远程ssh,都登录不上,只能无奈的重启。大家发现,只要启动某个应用,过不了几分钟,就会出现这种情况。最终定位到了几行让人啼笑皆非的代码。有位对多线程不太熟悉的同学,使用了线程池去异步处理消息。通常,我们都会把线程池作为类..转载 2022-01-26 14:04:16 · 215 阅读 · 0 评论 -
Java多线程基本概念
多核的机器,现在已经非常常见了。即使是一块手机,也都配备了强劲的多核处理器。通过多进程和多线程的手段,就可以让多个CPU同时工作,来加快任务的执行。多线程,是编程中一个比较高级的话题。由于它涉及到共享资源的操作,所以在编码时非常容易出现问题。Java的concurrent包,提供了非常多的工具,来帮助我们简化这些变量的同步,但学习应用之路依然充满了曲折。本篇文章,将简单的介绍一下Java中多线程的基本知识。然后着重介绍一下初学者在多线程编程中一些最容易出现问题的地方,很多都是血泪经验。规避了这些坑,转载 2022-01-26 14:01:15 · 281 阅读 · 0 评论 -
一文看懂Java锁机制
背景知识指令流水线CPU的基本工作是执行存储的指令序列,即程序。程序的执行过程实际上是不断地取出指令、分析指令、执行指令的过程。几乎所有的冯•诺伊曼型计算机的CPU,其工作都可以分为5个阶段:取指令、指令译码、执行指令、访存取数和结果写回。现代处理器的体系结构中,采用了流水线的处理方式对指令进行处理。指令包含了很多阶段,对其进行拆解,每个阶段由专门的硬件电路、寄存器来处 理,就可以实现流水线处理。实现更高的CPU吞吐量,但是由于流水线处理本身的额外开销,可能会增加延迟。cpu多级缓存转载 2022-01-25 20:44:53 · 231 阅读 · 0 评论 -
详解synchronized与Lock的区别与使用
技术点:1.线程与进程:在开始之前先把进程与线程进行区分一下,一个程序最少需要一个进程,而一个进程最少需要一个线程。关系是线程–>进程–>程序的大致组成结构。所以线程是程序执行流的最小单位,而进程是系统进行资源分配和调度的一个独立单位。以下我们所有讨论的都是建立在线程基础之上。2. Thread的几个重要方法:start()方法,调用该方法开始执行该线程; stop()方法,调用该方法强制结束该线程执行; join方法,调用该方法等待该线程结束。 sleep()方法,调用该转载 2022-01-24 20:26:18 · 1206 阅读 · 0 评论 -
JDK1.6之后synchronized关键字底层优化
JDK1.6 对锁的实现引入了大量的优化,如偏向锁、轻量级锁、自旋锁、适应性自旋锁、锁消除、锁粗化等技术来减少锁操作的开销。锁主要存在四种状态,依次是:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态,他们会随着竞争的激烈而逐渐升级。注意锁可以升级不可降级,这种策略是为了提高获得锁和释放锁的效率。何为重量级锁synchronized在jdk1.6之前,一直都是重量级锁。为什么称之为重量级锁呢,主要是因为锁的资源是通过操作系统去申请 ,所以比较重量级。synchronized底层是借助操作系统的M转载 2022-01-24 14:55:06 · 612 阅读 · 0 评论 -
ReentrantLock中的公平锁可能并不是真正意义上的公平
一、情景假设当前有三个线程A、B、C,分别取调用公平锁的lock.lock();假设线程A一马当先,先获取到锁,此时state == 1。然后线程B,也来到了tryAcquire方法protected final boolean tryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) {转载 2022-01-22 16:21:00 · 140 阅读 · 0 评论 -
说一下公平锁和非公平锁的区别?
前言上次我们提到了乐观锁和悲观锁,那我们知道锁的类型还有很多种,我们今天简单聊一下,公平锁和非公平锁两口子,以及他们在我们代码中的实践。正文开始聊之前,我先大概说一下他们两者的定义,帮大家回顾或者认识一下。公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁。 优点:所有的线程都能得到资源,不会饿死在队列中。 缺点:吞吐量会下降很多,队列里面除了第一个线程,其他的线程都会阻塞,cpu唤醒阻塞线程的开销会很大。 非公平锁:多个线转载 2022-01-22 16:16:26 · 185 阅读 · 0 评论 -
ArrayList线程不安全原因、复现以及解决办法
原因因为他的读写方法没有同步策略,会导致脏数据和不可预期的结果。// 非原子方法,并且没有同步策略public class ArrayList<E> { public E get(int index) { rangeCheck(index); return elementData(index); } public E set(int index, E element) { rangeCheck(index)原创 2022-01-18 21:24:48 · 2938 阅读 · 0 评论 -
Java内存模型
Java内存模型规定了所有的变量都存放在主内存中,当线程使用变量时候都是把主内存里面的变量拷贝到了自己的工作空间或者叫做工作内存。如图是双核CPU系统架构,每核有自己的控制器和运算器,其中控制器包含一组寄存器和操作控制器,运算器执行算术逻辑运算,并且有自己的一级缓存,并且有些架构里面双核还有个共享的二级缓存。对应Java内存模型里面的工作内存,在实现上这里是指L1或者L2缓存或者自己cpu的寄存器。当线程操作一个共享变量时候操作流程为:线程首先从主内存拷贝共享变量到自己的工作空间 然后..转载 2022-01-18 21:17:21 · 41 阅读 · 0 评论 -
什么是线程安全问题
线程安全问题是指当多个线程同时读写一个状态变量,并且没有任何同步措施时候,导致脏数据或者其他不可预见的结果的问题。Java中首要的同步策略是使用Synchronized关键字,它提供了可重入的独占锁。转载:高并发编程必备基础 | 并发编程网 – ifeve.com...转载 2022-01-18 21:14:44 · 414 阅读 · 0 评论