![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程
文章平均质量分 78
HD243608836
这个作者很懒,什么都没留下…
展开
-
java并发 —— AQS 详细介绍
只有当state大于0的时候,阻塞的线程才能继续执行,此时先前执行任务的线程继续执行release方法,release方法使得state的变量会加1,那么自旋的线程便会判断成功。AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore,其他的诸如ReentrantReadWriteLock,SynchronousQueue,FutureTask(jdk1.7)等等皆是基于AQS的。...转载 2022-07-23 13:56:32 · 521 阅读 · 0 评论 -
Java中同一个类中不同的synchronized方法是否可以并发执行 ?
更通俗简单的问法"Java中两个线程,是否可以同时访问一个对象的两个不同的synchronized方法?"答案是不可以!!!让大神们见笑了~~但是如果你也有和我一样的观念,那么就请仔细阅读下面的文字!!多个线程访问同一个类的synchronized方法时,都是串行执行的!就算有多个cpu也不例外!锁住的是方法所属对象本身.同一个锁某个时刻只能被一个执行线程所获取,因此其他线程都得等待锁的释放....转载 2022-07-20 15:41:08 · 1399 阅读 · 0 评论 -
面试官绝杀:系统是如何支撑高并发的?
很多人面试的时候被问到一个让人特别手足无措的问题:你的系统如何支撑高并发?大多数同学被问到这个问题压根儿没什么思路去回答,不知道从什么地方说起,其实本质就是没经历过一些真正有高并发系统的锤炼罢了。因为没有过相关的项目经历,所以就没法从真实的自身体会和经验中提炼出一套回答,然后系统地阐述出来自己复杂过的系统如何支撑高并发的。所以,这篇文章就从这个角度切入来简单说说这个问题,教你用一个最简...转载 2019-12-16 18:21:05 · 370 阅读 · 0 评论 -
线程池,这一篇或许就够了
为什么用线程池 创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率 例如: 记创建线程消耗时间T1,执行任务消耗时间T2,销毁线程消耗时间T3 如果T1+T3>T2,那么是不是说开启一个线程来执行这个任务太不划算了! 正好,线程池缓存线程,可用已有的闲置线程来执行新任务,避免了T1+T3带来的系统开销 线程并发数量过...转载 2019-12-16 18:05:18 · 273 阅读 · 0 评论 -
CountDownLatch和CyclicBarrier有什么区别?
CountDownLatch有时被称为“闭锁”,其作用相当于一扇门:在CountDownLatch达到结束状态之前,这扇门一直是关闭的,并且没有任何线程能通过,当到达结束状态时,这扇门会打开并允许所有的线程通过。当CountDownLatch到达结束状态后,将不会再改变状态,因此这扇门将永远保持打开状态。CountDownLatch可以用来确保某些活动直到其它活动都完成后才继续执行。Cycli...转载 2019-12-10 23:34:46 · 458 阅读 · 0 评论 -
原子操作类AtomicInteger详解
为什么需要AtomicInteger原子操作类?对于Java中的运算操作,例如自增或自减,若没有进行额外的同步操作,在多线程环境下就是线程不安全的。num++解析为num=num+1,明显,这个操作不具备原子性,多线程并发共享这个变量时必然会出现问题。测试代码如下:public class AtomicI...转载 2019-12-10 22:29:35 · 161 阅读 · 0 评论 -
NIO(IO多路复用)——select、poll、epoll之间的区别(搜狗面试)
转载自:https://www.cnblogs.com/aspirant/p/9166944.html(1)select==>时间复杂度O(n)它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时...转载 2019-12-09 11:52:16 · 1122 阅读 · 0 评论 -
共享出行业务下的高并发场景及解决方案(解决方案很具体!!很好!!)
转载自:https://gitbook.cn/books/5ae2bcf8fcb8aa431d69d3a3/index.html某共享汽车出行平台从随着业务的发展,可能大家听到出行以为是滴滴,然而不是,不过今年美团等巨头也入场共享汽车行业,表明公司业务至少是不错的,城市也在不断扩张,随着最初的 3 台车到目前运营几千台车,也在不断发展过程中,拥有了自己的固件平台,也正式由于此导致在一些业务过程...转载 2019-12-05 14:20:12 · 536 阅读 · 0 评论 -
Java面试常考的 BIO(即普通IO),NIO,AIO 总结
文章转载自:JavaGuide目录: 1. BIO (Blocking I/O)<ul><li> <p>1.1 传统 BIO</p> ...转载 2019-12-02 11:22:17 · 280 阅读 · 0 评论 -
不怕难之BlockingQueue及其实现
节选自:https://www.jianshu.com/p/7b2f1fa616c65 总结在上面分析LinkedBlockingQueue的源码之后,可以与ArrayBlockingQueue做一个比较。ArrayBlockingQueue:一个对象数组+一把锁+两个条件入队与出队都用同一把锁在只有入队高并发或出队高并发的情况下,因为操作数组,且不需要扩容,性能...转载 2019-11-05 14:25:55 · 186 阅读 · 0 评论 -
Java并发编程之Condition详解
在Java程序中,任意一个Java对象,都拥有一组监视器方法(定义在java.lang.Object类上),主要包括wait()、wait(long)、notify()、notifyAll()方法,这些方法与synchronized关键字配合,可以实现等待/通知模式。Condition接口也提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式,但是这两者在使用方式以及功能特...转载 2019-11-05 13:19:18 · 181 阅读 · 0 评论 -
Java并发编程之CyclicBarrier详解
简介栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生。栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行。闭锁用于等待事件,而栅栏用于等待其他线程。CyclicBarrier可以使一定数量的线程反复地在栅栏位置处汇集。当线程到达栅栏位置时将调用await方法,这个方法将阻塞直到所有线程都到达栅栏位置。如果所有线程都到达栅栏位置,那么栅栏将打开,此时所有的线程都将被释放...转载 2019-11-05 13:14:44 · 118 阅读 · 0 评论 -
ReentrantLock和AQS的关系(一篇让我搞懂了AQS原理!!牛!!)
首先我们来看看,如果用java并发包下的ReentrantLock来加锁和释放锁,是个...转载 2019-11-05 12:05:54 · 1799 阅读 · 3 评论 -
单例模式——指令重排
单例模式写法有很多,于是我看到了这么一种写法:public class SingletonTest { private SingletonTest() { } private static SingletonTest singletonTest = null; public static SingletonTest getSingletonTest() ...转载 2019-11-04 22:06:30 · 1444 阅读 · 0 评论 -
在多线程情况下 局部变量与全局变量 哪个比较安全呢
局部变量是在栈中运行。每个运行的线程都有自己的堆栈。别的线程无法访问得到,因此我们说,局部变量是“安全”的。全局变量是在堆中运行。堆是对所有的线程都可见的。因此在两个以上的线程访问全局变量时,就会出现所谓的“不安全”,a线程访问全局变量,赋值为a,然后中间睡眠了0.001秒,在此期间b进程访问了全局变量,赋值为b了,此时a线程醒来了,抢了处理机,发现全局变量是b,显然不是我们a线程所要到...转载 2019-11-04 14:49:13 · 396 阅读 · 0 评论 -
高并发其实挺容易的,当你明白了一万并发的原理,然后扩展到百万、千万、亿万级很easy
来自知乎的一个大神的回答:https://zhuanlan.zhihu.com/p/38636111高并发其实挺容易的,当你明白了一万并发的原理,然后扩展到百万、千万、亿万级很easy要点有如下几项:1、垂直分层:DNS层、跨机房部署、LVS+Nginx负载均衡,vanish+共享存储实现动静分离,Nginx后挂载N台服务器集群,服务器集群后挂载微服务化、微服务后挂载数据库分库分表...转载 2019-10-25 01:09:10 · 6916 阅读 · 2 评论 -
数据库两大必备神器:索引和锁底层原理是什么(抽时间必看的)
前言只有光头才能变强索引和锁在数据库中可以说是非常重要的知识点了,在面试中也会经常会被问到的。本文力求简单讲清每个知识点,希望大家看完能有所收获声明:如果没有说明具体的数据库和存储引擎,默认指的是MySQL中的InnoDB存储引擎一、索引在之前,我对索引有以下的认知:索引可以加快数据库的检索速度 表经常进行INSERT/UPDATE/DELETE操作就不要建立...转载 2019-10-22 04:26:56 · 281 阅读 · 0 评论 -
ConcurrentHashMap在jdk1.7和jdk1.8中的不同(简单说)
原博客:https://www.cnblogs.com/lujiango/p/7580558.htmlhttp://www.importnew.com/28263.htmlCouncurrentHashMap 线程安全一、CouncurrentHashMap<jdk1.7>底层:1.底层数据结构<jdk1.7>:数组(Segment) + 数组(HashEn...转载 2019-10-22 02:01:02 · 1128 阅读 · 1 评论 -
并发容器之ConcurrentHashMap(JDK 1.8版本区别于1.7)(详细说)
转载自,原文格式清晰:https://www.jianshu.com/p/c02a5627d0a51.ConcurrentHashmap简介在使用HashMap时在多线程情况下扩容会出现CPU接近100%的情况,因为hashmap并不是线程安全的,通常我们可以使用在java体系中古老的hashtable类,该类基本上所有的方法都采用synchronized进行线程安全的控制,可想而知...转载 2019-10-22 02:06:16 · 363 阅读 · 0 评论 -
扛住阿里双十一高并发流量,Sentinel是怎么做到的?(阿里高并发如何处理)
好文章!!转载自:[https://blog.csdn.net/u014714618/article/details/102559493](https://blog.csdn.net/u014714618/article/details/102559493)Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景本文介绍阿里开源限流熔断方案 Sentinel 功能、原理、架构、...转载 2019-10-20 17:24:21 · 225 阅读 · 0 评论 -
Redis Sharding(redis集群分片)方案(其中代理服务器方式的一致性hash算法分片算法很重要!!)
Redis Sharding方案什么是Redis分片分片(partitioning)就是将你的数据拆分到多个 Redis 实例的过程,这样每个实例将只包含所有键的子集。分片为何有用Redis 的分片承担着两个主要目标:允许使用很多电脑的内存总和来支持更大的数据库。没有分片,你就被局限于单机能支持的内存容量。允许伸缩计算能力到多核或多服务器,伸缩网络带宽到多服务器或多网络适配器...转载 2019-10-18 23:07:29 · 1115 阅读 · 0 评论 -
Twitter的分布式雪花分片ID算法(SnowFlake)每秒自增生成26个万个可排序的ID (Java版)
分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的SnowFlake解决了这种需求,最初Twitter把存储系统从MySQL迁移到Cassandra,因为Cassandra没有顺序I...转载 2019-10-18 21:47:40 · 1201 阅读 · 0 评论 -
分布式系统面试题:分布式事务解决方案?(重点)
面试题分布式事务了解吗?你们是如何解决分布式事务问题的?面试题剖析一般来说,分布式事务的实现主要有以下 5 种方案:XA 方案 TCC 方案 本地消息表 可靠消息最终一致性方案 最大努力通知方案两阶段提交方案/XA方案所谓的 XA 方案,即:两阶段提交,有一个事务管理器的概念,负责协调多个数据库(资源管理器)的事务,事务管理器先问问各个数据库你准备好了吗?如果每个数据...转载 2019-10-18 01:23:31 · 557 阅读 · 0 评论 -
三种实现分布式锁的方式(很简洁直观)
一、为什么要使用分布式锁我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,可以使用我们学到的Java多线程的18般武艺进行处理,并且可以完美的运行,毫无Bug!注意这是单机应用,也就是所有的请求都会分配到当前服务器的JVM内部,然后映射为操作系统的线程进行处理!而这个共享变量只是在这个J...转载 2019-10-18 00:31:43 · 185 阅读 · 0 评论 -
五分钟理解一致性哈希算法(consistent hashing)(很重要!主要应用于redis并发)
转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在...转载 2019-10-17 19:09:41 · 191 阅读 · 0 评论 -
分布式环境下限流方案的实现
转载自:https://blog.csdn.net/Justnow_/article/details/53055299业务背景介绍 对于web应用的限流,光看标题,似乎过于抽象,难以理解,那我们还是以具体的某一个应用场景来引入这个话题吧。 在日常生活中,我们肯定收到过不少不少这样的短信,“双11约吗?,千款….”,“您有幸获得唱读卡,赶快戳链接…”。这种类型的短信是属于推广性质的短信...转载 2019-10-17 16:13:28 · 331 阅读 · 0 评论 -
并发性能优化之使用LongAdder替换AtomicLong(计数器)
如果让你实现一个计数器,有点经验的同学可以很快的想到使用AtomicInteger或者AtomicLong进行简单的封装。因为计数器操作涉及到内存的可见性和线程之间的竞争,而Atomic*的实现完美的屏蔽了这些技术细节,我们只需要执行相应的方法,就能实现对应的业务需求。Atomic虽然好用,不过这些的操作在并发量很大的情况下,性能问题也会被相应的放大。我们可以先看下其中getAndIncrem...转载 2019-10-17 15:44:46 · 414 阅读 · 0 评论 -
聊聊高并发系统之限流特技(二)作者:张开涛
转载自,原文格式清晰:https://www.iteye.com/blog/jinnianshilongnian-2305117接上文的聊聊高并发系统限流特技-1 原文来自开涛的博客对于分布式限流目前遇到的场景是业务上的限流,而不是流量入口的限流;流量入口限流应该在接入层完成,而接入层笔者一般使用Nginx接入层限流接入层通常指请求流量的入口,该层的主要目的有:负载均衡、非法...转载 2019-10-17 15:37:32 · 290 阅读 · 0 评论 -
聊聊高并发系统之限流特技(一)作者:张开涛
原文比较长,在此分成了两个文章。原文链接:https://www.iteye.com/blog/jinnianshilongnian-2305117最近一直都在研究压力测试客户端的问题,如果突破客户端压力测试线程,端口等问题,如果服务器端处理网络请求处理不过来,严重会造成宕机,在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流限流在开发高并发系统时有三把利器用来保护系统...转载 2019-10-17 15:22:40 · 441 阅读 · 0 评论 -
ExecutorService线程池
ExecutorService的submit和executeExecuteService代表的是Executors创建的线程池①submit提交的是实现了Callable接口的方法,有返回值(返回Future,执行future.get()方法即可获取具体返回值)②execute执行的是实现了Runnable接口的方法,没有返回值所以线程池对象executorService选择使用submit和...转载 2019-10-16 00:59:55 · 608 阅读 · 1 评论 -
关于多线程中断的interrupt,interrupted和isInterrupted的理解
(1)interrupt:调用interrupt()方法来停止线程,不会马上终止,它仅仅是在当前的线程中打了一个停止的标记。即不会影响线程的正常运行,只是该线程多了一个停止的标记而已。(2)interrupted:测试的是当前线程是否处于中断状态,是一个静态方法,在一次执行后具有将状态标志清除为false的状态。即连续两次调用该方法后,第二次调用则会返回false。源码如下:(3)...转载 2019-10-15 22:04:47 · 255 阅读 · 0 评论 -
ArrayList和CopyOnWriteArrayList
转载自,原文格式清晰:https://www.cnblogs.com/simple-focus/p/7439919.html这篇文章的目的如下:了解一下ArrayList和CopyOnWriteArrayList的增删改查实现原理 看看为什么说ArrayList查询快而增删慢? CopyOnWriteArrayList为什么并发安全且性能比Vector好1. List接口首...转载 2019-05-20 16:55:48 · 202 阅读 · 0 评论 -
Java并发编程:并发容器之CopyOnWriteArrayList(转载)
原文链接: http://ifeve.com/java-copy-on-write/Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并...转载 2019-05-20 17:32:56 · 180 阅读 · 0 评论 -
Copy On Write写时复制原理
kafka删除日志文件,使用的策略:Copy On Write写时复制日志文件的删除策略非常简单:启动一个后台线程定期扫描log file列表,把保存时间超过阀值的文件直接删除(根据文件的创建时间).为了避免删除文件时仍然有read操作(consumer消费),采取copy-on-write方式.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~...转载 2019-05-20 17:49:03 · 928 阅读 · 0 评论 -
架构设计之「服务限流」
上一篇我们聊过了架构设计中的「服务隔离」模式,今天我们继续来探索一下在分布式系统架构中的另一个常用的设计:服务限流。那么,什么是「服务限流」呢?在解释「服务限流」之前,我们来看一下前些时间网上很火的一个段子,说的是新浪微博的一名工程师正在家里办婚礼,突然接到公司的电话要紧急处理线上流量激增的问题,那天应该是某当红明星突然在微博上公布恋情,微博流量突增好几倍,导致系统功能出现不稳定,用户访问不...转载 2019-05-22 10:57:52 · 191 阅读 · 0 评论 -
谈谈高并发系统的限流
转载自:https://www.cnblogs.com/haoxinyue/p/6792309.html开涛大神在博客中说过:在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。本文结合作者的一些经验介绍限流的相关概念、算法和常规的实现方式。缓存缓存比较好理解,在大型高并发系统中,如果没有缓存数据库将分分钟被爆,系统也会瞬间瘫痪。使用缓存不单单能够提升系统访问速度、提高并...转载 2019-05-22 11:02:31 · 208 阅读 · 0 评论 -
高并发限流策略
转载自:https://www.cnblogs.com/tietazhan/p/6249479.html在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。缓存的目的是提升系统访问速度和增大系统能处理的容量,可谓是抗高并发流量的银弹;而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,待高峰或者问题解决后再打开;而有些场景并不能用缓存和降级来解决,比如稀缺资源(秒杀、抢...转载 2019-05-22 11:09:46 · 444 阅读 · 0 评论 -
什么时候使用CountDownLatch
正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。在Java并发中,countdownlatch的概念是一个常见的面试题,所以一定要确保你很好的理解了它。在这篇文章中,我将会涉及到在Java并发编 程中跟CountDownLatch相关的以下几点:目录CountDownLatch是什么? Cou...转载 2019-06-14 16:20:23 · 224 阅读 · 0 评论 -
java多线程wait时为什么要用while而不是if
前言:我不能明白为什么就会出错。不是有synchronized关键字加锁了吗?其实,这里也错在我对wait方法原理的实际运行效果不是很了解,当我在wait方法的前后都加上输出提示语句后,我明白了。一个线程执行了wait方法以后,它不会再继续执行了,直到被notify唤醒。那么唤醒以后从何处开始执行?这是解决这里出错原因的关键。正文:对于java多线程的wait...转载 2019-07-30 10:41:23 · 578 阅读 · 1 评论 -
由浅入深理解Java线程池及线程池的如何使用(精辟!!)
原文格式清晰,转载自:https://www.cnblogs.com/superfj/p/7544971.html前言多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担。线程本身也要占用内存空间,大量的线程会占用内存资源并且可能会导致Out of Memory。即便没有这样的情况,大量的线程回收也会给GC带来很大的压力。为了避免...转载 2019-08-01 21:53:37 · 190 阅读 · 0 评论