并发(多线程)
文章平均质量分 84
魏小言
BAT资深工程师,Cloud Native 拥护者,敏捷实践者,坚守开发一线打磨工匠技艺的架构师。对基础架构和微服务有丰富的研究和实践。微信群请私信博主
展开
-
Consul分布式锁原理详解及实例
Consul分布式锁原理详解及实例现在大型系统为了保证服务高可用,都为分布式架构。Consul是一款较zookeepr、etcd等年轻的纯Goland分布式服务架构。其包含多个功能模块服务发现、检查健康、K/V存储、多数据中心等,这里就其分布式锁进行介绍。整体来讲,Consul分布式锁实现和其K/V存储的特性密切相关。K/V最常见的是Redis,其SetNx也可完成分布式锁的功能,这里暂不做介绍。Consul与Redis不同,其K/V依赖Session,可以说K/V->Session是多对一的关系原创 2021-05-01 17:13:10 · 1534 阅读 · 2 评论 -
线程切换比进程快
线程比进程更快,吞吐更强,本文从切换方面介绍 我们都知道线程切换的开销比进程切换的开销小,那么小在什么地方?切换的过程是怎样的?无论是在多核还是单核系统中,一个CPU看上去都像是在并发的执行多个进程,这是通过处理器在进程间切换来实现的。操作系统实现这种交错执行的机制称为上下文切换。操作系统保持跟踪进程运行所需的所有状态信息,这种状态,也就是上下文,它包括许多信息,例如PC和寄存器文件的当前值,以及主存的内容。在任何一个时刻,单处理器系统都只能执行一个进程的代码。当操作系统决定要把控制转载 2020-11-30 17:53:57 · 3775 阅读 · 0 评论 -
java ThreadLocal(应用场景及使用方式及原理)
虽然ThreadLocal与并发问题相关,但是许多程序员仅仅将它作为一种用于“方便传参”的工具,胖哥认为这也许并不是ThreadLocal设计的目的,它本身是为线程安全和某些特定场景的问题而设计的。ThreadLocal是什么呢!每个ThreadLocal可以放一个线程级别的变量,但是它本身可以被多个线程共享使用,而且又可以达到线程安全的目的,且绝对线程安全。例如:public final...原创 2019-01-23 16:10:30 · 727 阅读 · 0 评论 -
JVM的GC-GMS详解
前言CMS,全称Concurrent Low Pause Collector,是jdk1.4后期版本开始引入的新gc算法,在jdk5和jdk6中得到了进一步改进,它的主要适合场景是对响应时间的重要性需求 大于对吞吐量的要求,能够承受垃圾回收线程和应用线程共享处理器资源,并且应用中存在比较多的长生命周期的对象的应用。CMS是用于对tenured generation的回收,也就是...转载 2018-05-14 18:47:27 · 2802 阅读 · 1 评论 -
深入理解Java并发之synchronized实现原理
最近在梳理关于同步的一些知识,发现知识的海洋无边际,学无止境,这里借鉴以为大佬的文章梳理一下synchronized的底层实现原理。首先是,synchronized都有什么应用场景呢? 概括,进程同步:修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁修饰代码块,指定加锁对象,对给定对象加锁,进入...转载 2018-05-07 21:06:10 · 273 阅读 · 0 评论 -
谈谈高并发系统的限流
谈谈高并发系统的限流 开涛大神在博客中说过:在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。本文结合作者的一些经验介绍限流的相关概念、算法和常规的实现方式。 缓存 缓存比较好理解,在大型高并发系统中,如果没有缓存数据库将分分钟被爆,系统也会瞬间瘫痪。使用缓存不单单能够提升系统访问速度、提高并发访问量,也是保护数据库、保护系统的有效方式。...转载 2018-04-10 11:25:57 · 237 阅读 · 0 评论 -
并发下线程池的数量计算
在高并发的情况下采用线程池,有效的降低了线程创建释放的时间花销及资源开销,如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。(在JVM中采用的处理机制为时间片轮转,减少了线程间的相互切换) 那么在高并发的情况下,我们怎么选择最优的线程数量呢?选择原则又是什么呢?这个问题去哪网的技术总监问过我,这里总结一下。 第一种:如果是CPU密集型应用,则线程池大小设置为N+原创 2017-12-25 18:28:59 · 21735 阅读 · 2 评论 -
为什么wait()一定要放在循环中
在多线程的编程实践中,wait()的使用方法如下:synchronized (monitor) { // 判断条件谓词是否得到满足 while(!locked) { // 等待唤醒 monitor.wait(); } // 处理其他的业务逻辑}12345678那为什么非要while判断,而不采用if判断呢?如下:synchron转载 2017-10-26 20:15:40 · 984 阅读 · 0 评论 -
锁的浅述
1.可重入锁 如果锁具备可重入性,则称作为可重入锁。像synchronized和ReentrantLock都是可重入锁,可重入性在我看来实际上表明了锁的分配机制:基于线程的分配,而不是基于方法调用的分配。举个简单的例子,当一个线程执行到某个synchronized方法时,比如说method1,而在method1中会调用另外一个synchronized方法method2,此时线程不必重新去申请锁,而原创 2017-10-08 15:41:58 · 249 阅读 · 0 评论 -
并发中的i++安全问题浅述
*多线程操作同一变量*此处不可能是局部变量,肯定是成员变量或静态变量 PS:为什么不可能是局部变量? 需要多线程访问局部变量,那么多个线程就必须在方法中进行定义,如使用匿名内部类方式定义多个线程。 在使用匿名内部类引用局部变量时,局部变量必须通过final来修饰。这样做的原因是变量的生命周期问题。 final修饰的变量,不管是int还是Integer,都不能进行自加操作。在A线程执行i++结原创 2017-09-25 16:59:44 · 789 阅读 · 0 评论 -
JVM中线程状态转换及线程操作函数的理解
关于线程转换的问题,简单来说就是5/3个状态相互转换,那么具体在什么情况下才转换呢,在这里借鉴几位大神加上自己的理解,总结如下: 5状态下是比3状态下多出了初始和结束两个状态,初始状态一般指的是thread.start(),结束状态是main()函数结束; 状态转换中只有就绪和运行状态是双向的。下面说一下具体转换条件,上图如下: 其中, Join方法实现是通过wait(转载 2017-09-25 16:16:35 · 209 阅读 · 0 评论