
并发
自由圣骑士
喜欢学习、喜欢接近新事物。
展开
-
抛出这8个问题,检验你是否真的会ThreadLocal
一、概述1、官方术语ThreadLocal类是用来提供线程内部的局部变量。让这些变量在多线程环境下访问(get/set)时能保证各个线程里的变量相对独立于其他线程内的变量。2、大白话ThreadLocal是一个关于创建线程局部变量的类。通常情况下,我们创建的成员变量都是线程不安全的。因为他可能被多个线程同时修改,此变量对于多个线程之间彼此并不独立,是共享变量。而使用ThreadLocal创建的变量只能被当前线程访问,其他线程无法访问和修改。也就是说:将线程公有化变成线程私有化。二、应用场景每个转载 2020-08-18 20:24:42 · 251 阅读 · 1 评论 -
每秒上千订单场景下的分布式锁高并发优化实践!
每秒上千订单场景下的分布式锁高并发优化实践!转载 2020-08-13 17:18:23 · 229 阅读 · 0 评论 -
太逗了,面试官让我讲线程 WAITING 状态!
太逗了,面试官让我讲线程 WAITING 状态!原创 2020-07-11 17:02:56 · 164 阅读 · 0 评论 -
高并发下,你都怎么选择最优的线程数
为了加快程序处理速度,我们会将问题分解成若干个并发执行的任务。并且创建线程池,将任务委派给线程池中的线程,以便使它们可以并发地执行。在高并发的情况下采用线程池,可以有效降低线程创建释放的时间花销及资源开销,如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及“过度切换”(在JVM中采用的处理机制为时间片轮转,减少了线程间的相互切换) 。但是有一个很大的问题摆在我们面前,即我们希望尽可能多地创建任务,但由于资源所限我们又不能创建过多的线程。那么在高并发的情况下,我们怎么选择最优的线程数量呢?选转载 2020-06-15 15:00:32 · 2143 阅读 · 1 评论 -
如何解决秒杀场景的流量削峰问题
流量削峰的由来主要是还是来自于互联网的业务场景,例如,马上即将开始的春节火车票抢购,大量的用户需要同一时间去抢购;以及大家熟知的阿里双11秒杀,短时间上亿的用户涌入,瞬间流量巨大(高并发),比如:200万人准备在凌晨12:00准备抢购一件商品,但是商品的数量却是有限的100-500件左右。这样真实能购买到该件商品的用户也只有几百人左右, 但是从业务上来说,秒杀活动是希望更多的人来参与,也就是抢...原创 2019-08-10 15:05:04 · 726 阅读 · 1 评论 -
如何实现子线程运行执行 4 次后,主线程再运行 2 次,这样交替执行三遍的程序
针对这个问题,需要使用线程互相协调完成工作,这样首先会想到在 synchronized 代码块中加入wait(),nodify()方法进行线程的协调配合完成工作,我这里使用了ReetrantLock的 Condition 机制去完成线程协调与配合,具体代码如下:package com.thread.communication;import java.util.concurrent.TimeU...原创 2019-08-22 10:58:36 · 265 阅读 · 0 评论 -
如何使用线程池去执行多个任务并且获取任务执行后的结果
代码如下:package com.thread.threadlocal;import java.util.HashSet;import java.util.List;import java.util.Set;import java.util.concurrent.*;public class MainTest { public static void main(Strin...原创 2019-08-22 14:54:50 · 2857 阅读 · 0 评论 -
BlockingQueue 阻塞队列
BlockingQueue 通常用于一个线程生产对象,而另外一个线程消费这些对象的场景。下图是对这个原理的阐述:一个线程往里边放,另外一个线程从里边取。一个线程将会持续生产新对象并将其插入到队列之中,直到队列达到它所能容纳的临界点。也就是说,它是有限的。如果该阻塞队列到达了其临界点,负责生产的线程将会在往里边插入新对象时发生阻塞。它会一直处于阻塞之中,直到负责消费的线程从队列中拿走一个对...原创 2019-08-22 20:00:17 · 415 阅读 · 0 评论 -
为什么 Java 线程没有 Running 状态
什么是 RUNNABLE?与传统的ready状态的区别与传统的running状态的区别当I/O阻塞时如何看待RUNNABLE状态?Java虚拟机层面所暴露给我们的状态,与操作系统底层的线程状态是两个不同层面的事。具体而言,这里说的 Java 线程状态均来自于 Thread 类下的 State 这一内部枚举类中所定义的状态:什么是 RUNNABLE?直接看它的 Javadoc 中的说...原创 2019-08-28 20:05:50 · 150 阅读 · 0 评论 -
java相关的流程图
1、spring的生命周期Spring作为当前Java最流行、最强大的轻量级容器框架,了解熟悉spring的生命周期非常有必要;1、首先容器启动后,对bean进行初始化。2、按照bean的定义,注入属性。3、检测该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给bean,如BeanNameAware等。4、以上步骤,bean对象已正确构造,通过实现BeanPos...原创 2019-08-31 11:55:19 · 212 阅读 · 0 评论 -
为什么ConcurrentHashMap的get操作不需要加锁?
我们知道,ConcurrentHashmap(1.8)这个并发集合框架是线程安全的,当你看到源码的get操作时,会发现get操作全程是没有加任何锁的这也是这篇博文讨论的问题——为什么它不需要加锁呢?1、ConcurrentHashMap的简介有基础的同学知道在jdk1.7中是采用Segment + HashEntry + ReentrantLock的方式进行实现的1.8中放弃了Segmen...原创 2019-09-07 11:50:38 · 6778 阅读 · 3 评论 -
Synchronized 底层原理
一、Synchronized的基本使用Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。Synchronized的作用主要有三个:确保线程互斥的访问同步代码保证共享变量的修改能够及时可见有效解决重排序问题。从语法上讲,Synchronized总共有三种用法:(1)修饰普通方法(2)修饰静态方法(3)修饰代码块接下来我就通过几个例子程序来说...原创 2019-09-23 16:13:20 · 141 阅读 · 0 评论 -
使用一个实际生活场景的故事说一下java并发
实际故事内容故事可能比较奇怪。有这么一个学校,里面有好多好多人,我们简单分成学生、老师、以及宿管阿姨。学校中间还有一个很奇葩的水果超市,里面有个仓库放着苹果、西瓜、橘子。来这个超市的人,一方面可以拿走水果吃掉,另一方面也可以送来水果还钱。不过超市还有一个很奇葩的规则,就是学生只能去吃或者送苹果,老师则只能西瓜,宿管阿姨只能橘子。这个超市的进出也很有规矩,来这个超市的人,必须持有相应的证件,...原创 2019-08-19 09:39:07 · 793 阅读 · 1 评论 -
深入探讨HashMap的底层结构、原理、扩容机制
简介Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示:下面针对各个实现类的特点做一些说明:(1) HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。...原创 2019-08-07 11:57:37 · 283 阅读 · 0 评论 -
线程的五大状态,以及线程之间的通信与协作
进程进程是操作系统进行资源分配和调度的基本单位。线程线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。多线程一个程序中有多个线程在同时执行。线程的生命周期java中每个线程都需经历新生(新建)、就绪(准备)、运行、阻塞和死亡五种状态,线程从新生到死亡的状态变化称为生命周期。新建状态使用 new Thread 类或其子类建立一个线程对象后,该线程对象就...原创 2019-08-03 11:19:48 · 218 阅读 · 0 评论 -
独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁
java相关的锁公平锁/非公平锁可重入锁独享锁/共享锁乐观锁/悲观锁分段锁自旋锁乐观锁 VS 悲观锁乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度,在Java和数据库中都有此概念对应的实际应用。乐观锁顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁...转载 2019-08-03 12:26:09 · 158 阅读 · 0 评论 -
并发编程相关的问题
并发编程的三要素原子性(atomic)原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行,比如在一个事务里不能一部分操作执行成功,一部分操作执行失败,要么全部执行成功,要么全部执行失败。可见性(volatile)可见性指多个线程操作一个共享变量时,其中一个线程对变量进行修改后,其他线程可以立即看到修改的结果。实现可见性的方法:synchro...原创 2019-08-03 16:26:15 · 218 阅读 · 0 评论 -
线程池
使用线程池的原因java中为了提高并发度,可以使用多线程共同执行,但是如果有大量线程短时间之内被创建和销毁,会占用大量的系统时间和性能开销,影响系统效率。为了解决上面的问题,java中引入了线程池,可以使创建好的线程在指定的时间内由系统统一管理,而不是在执行时创建,执行后就销毁,从而避免了频繁创建、销毁线程带来的系统开销。线程池的处理流程以ThreadPoolExecutor为例,当我们把...原创 2019-08-05 14:49:05 · 97 阅读 · 0 评论 -
4种常用Java线程锁的特点,性能比较、使用场景
多线程的缘由在出现了进程之后,操作系统的性能得到了大大的提升。虽然进程的出现解决了操作系统的并发问题,但是人们仍然不满足,人们逐渐对实时性有了要求。使用多线程的理由之一是和进程相比,它是一种非常花销小,切换快,更”节俭”的多任务操作方式。在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种”昂贵”的多任务工作方式。而在进程...原创 2019-08-05 15:33:26 · 439 阅读 · 0 评论 -
CurrentHashMap的实现原理
hash表介绍哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值。哈希的思路很简单,如果所有的键都是整数,那么就可以使用一个简单的无序数组来实现:将键作为索引,值即为其对应的值,这样就可以快速访问任意键的值。这是对于简单的键的情况,我们将其扩展到可以处理更加复杂的类型的键。链式hash表链式哈希表从根本上说是由一组链表...原创 2019-08-05 19:59:43 · 92287 阅读 · 11 评论 -
解决redis并发key的竞争问题-比如多个客户端set操作导致的并发问题
Redis高并发的问题以及今天要谈到的Redis并发竞争问题,这里的并发指的是多个redis的client同时set key引起的并发问题。比如:多客户端同时并发写一个key,一个key的值是1,本来按顺序修改为2,3,4,最后是4,但是由于并发设置的原因,最后顺序变成了4,3,2,最后变成的key值成了2。如何解决Redis的并发竞争key问题第一种方案:分布式锁1.整体技术方案这种...原创 2019-08-08 11:20:36 · 4397 阅读 · 1 评论 -
Redis数据与数据库数据的一致性解决方案
业务场景在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库。这个业务场景,主要是解决读数据从Redis缓存,一般都是按照下图的流程来进行业务操作。读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现缓存(Redis)和数据库(MySQL)间的...原创 2019-08-08 11:53:49 · 848 阅读 · 0 评论 -
redis单线程的原因和并发快的原因
Redis的高并发和快速原因1、redis是基于内存的,内存的读写速度非常快;2、redis是单线程的,省去了很多上下文切换线程的时间;3、redis使用多路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间。为什么redis...原创 2019-08-08 16:27:58 · 366 阅读 · 0 评论 -
解决redis缓存穿透、redis缓存雪崩问题
redis缓存雪崩数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机。比如一个雪崩的简单过程:1、redis集群大面积故障2、缓存失效,但依然大量请求访问缓存服务redis3、redis大量失效后,大量请求转向到mysql数据库4、mysql的调用量暴增,很快就扛不住了,甚至直接宕机5、由于大量的应用服务依赖mys...原创 2019-08-08 16:32:04 · 2204 阅读 · 0 评论 -
java并发工具类、并发容器、并发队列
并发工具类提供了比synchronized更加高级的各种同步结构:包括CountDownLatch、CyclicBarrier、Semaphore等,可以实现更加丰富的多线程操作。CountDownLatch功能CountDownLatch是一个同步的辅助类,允许一个或多个线程,等待其他一组线程完成操作,再继续执行。原理CountDownLatch是通过一个计数器来实现的,计数器的初始...原创 2019-08-06 17:27:13 · 300 阅读 · 0 评论 -
偏向锁、轻量级锁、自旋锁、Synchronized同步锁(重量级锁)
Synchronizedsynchronized的作用是保证在同一时刻, 被修饰的代码块或方法只会有一个线程执行,以达到保证并发安全的效果。Synchronized的使用synchronized的3种使用方式修饰实例方法:作用于当前实例加锁修饰静态方法:作用于当前类对象加锁修饰代码块:指定加锁对象,对给定对象加锁synchronized的代码范例Synchronized的底层实现...原创 2019-08-03 10:22:15 · 445 阅读 · 0 评论