并发
vincent_hahaha
haha ha
展开
-
java高并发(一)导学
现在准备系统学习java高并发与多线程相关知识。 首先了解一下我们这一套知识的学习思路: 并发与高并发相关概念 CPU多级缓存 缓存一致性 乱序执行优化 java内存模型 JMM规定、抽象结构 同步操作与规则 并发优势与风险 并发模拟 Postman、JMetter、Apache Bench、代码 并发及并发的线程安全处理 线程安全性 原子性、可见性、有序...原创 2019-07-22 11:23:00 · 99 阅读 · 0 评论 -
java高并发(二十)HashMap与ConcurrentHashMap
HashMap HashMap底层就是一个数组,而数组的每一项都是一个链表,当我们新建一个HashMap时就会初始化一个数组。HashMap有两个参数影响性能,分别是初始容量和加载因子。 HashMap寻址方式:对于一个新插入的数据或者需要读取的数据,HashMap需要根据key按照一个计算规则计算出Hash值并对我们的数组长度进行取模,取模结果作为数组的index,而取模的代价远远高于...原创 2019-08-02 11:43:00 · 99 阅读 · 0 评论 -
java高并发(十九)死锁、spring线程安全
死锁的必要条件 互斥条件 请求和保持条件 不剥夺条件 环路等待条件 /** * 一个简单的死锁类 * 当DeadLock的对象flag==1时(d1), 先锁定o1,睡眠500毫秒 * 而d1在睡眠的时候留一个flag=0的对象(d2)线程启动,先锁定o2,睡眠500毫秒 * d1睡眠结束后需要锁定o2才能继续执行,而此时o2已经被d2锁定; * d2睡眠结束后需要...原创 2019-08-02 11:05:00 · 126 阅读 · 0 评论 -
java高并发(十八)线程池
在之前已经使用过线程池了。在使用中,基本上就是初始化好线程池的实例之后,把任务丢进去,等待调度执行就可以了。使用起来非常简单方便。 new Thread弊端 每次new Thread新建对象,性能差 线程缺乏统一管理,可能无限制的新建线程,相互竞争,有可能占用过多系统资源导致死机或者OOM 缺少更多功能,如更多执行、定期执行、线程中断 线程池的好处 重用存在的线程,减少对象创建、...原创 2019-08-01 16:06:00 · 137 阅读 · 0 评论 -
java高并发(十六)J.U.C之ForkJoin
ForkJoin框架是Java7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。 与MapReduce思想非常类似。从字面意思上看,Fork就是把一个大任务切割成若干个子任务并行执行,Join就是合并这些子任务的执行结果,最后得到大任务的结果。主要采用工作窃取算法。 工作窃取算法是指某个线程从其他队列里窃取任务来执行。下...原创 2019-08-01 11:48:00 · 96 阅读 · 0 评论 -
java高并发(十四)ReetrantLock 与锁
java主要分两类锁,一种是synchronized关键字修饰的锁,另一种是J.U.C.提供的锁。J.U.C里核心锁就是ReentrantLock ReentrantLock(可重入锁)和synchronized区别 可重入性 锁的实现,synchronized关键字是依赖于JVM实现的,而ReentrantLock是JDK实现的,这两个有什么区别?说白了就类似于操作系统来控制实现和用户自己...原创 2019-07-30 17:11:00 · 129 阅读 · 0 评论 -
java高并发(十三)并发容器J.U.C--AQS
AbstractQueueSynchronizer (AQS) J.U.C 大大提高了java并发的性能,而AQS则是J.U.C的核心。 AQS底层使用双向列表(队列的一种实现)。 使用Node实现FIFO队列,可以用于构建锁或者其他同步装置的基础框架 利用了一个int类型表示状态。在AQS中有一个status的成员变量,基于AQS有一个同步组件ReentrantLock,在这个Reen...原创 2019-07-30 16:42:00 · 138 阅读 · 0 评论 -
java高并发(十二)并发容器J.U.C
并发容器是JDK提供的一个包名:java.util.concurrent ArrayList -> CopyOnWriteArrayList CopyOnWriteArrayList是线程安全的,写操作时复制,当有新元素添加到CopyOnWriteArrayList时先从原有的list中拷贝出来,然后在新的list上写操作,写完之后将原来的list指向新的list,整个操作都是在锁的保护...原创 2019-07-29 17:32:00 · 87 阅读 · 0 评论 -
java高并发(十)线程不安全类与写法
什么是线程不安全类? 如果一个类的对象同时可以被多个线程访问,如果不做特殊的同步与并发处理,就很容易表现出线程不安全的现象,比如抛出异常,比如逻辑处理错误等,这种类就是线程不安全类。 StringBuilder->StringBuffer @Slf4j public class StringExample1 { // 请求总数 public static int cl...原创 2019-07-29 14:46:00 · 127 阅读 · 0 评论 -
java高并发(十一)同步容器
上面一节我们介绍了ArrayList、HashSet、HashMap这些容器都是非线程安全的。如果有多个线程并发访问这些容器时,就会触发线程安全问题。因此在编写程序的时候,必须要求开发人员手动的在任何访问到这些容器的地方进行同步处理,这样就导致使用起来非常不便。因此java提供了同步容器方便使用。 在java中同步容器主要包括两类: ArrayList -> Vector,Stack;...原创 2019-07-29 16:24:00 · 80 阅读 · 0 评论 -
java高并发(九)线程封闭
上一节介绍了不可变对象,通过在某些情况下将不会修改的类对象设计成不可变对象,来让对象在多个线程间保证对象是线程安全的。归根到底,相当于躲避开了并发问题,实现好的并发是一件很困难的事情,所以很多时候都想躲避并发,避免并发除了设计成不可变对象其实还有一个简单的方法就是线程封闭。 什么是线程封闭? 其实就是把对象封装到一个线程里,只有这一个线程能看到这个对象。那么这个对象就算不是线程安全的,也不会出...原创 2019-07-28 22:25:00 · 88 阅读 · 0 评论 -
java高并发(八)不可变对象
有一种对象一旦发布了,那么他就是安全对象,这就是不可变对象。 不可变对象需要满足的条件: 对象创建以后其状态就不能修改 对象所有的域都是final类型 对象是正确创建的(在对象创建期间,this引用没有逸出) final关键字:类、方法、变量 修饰类:不能被继承。final类中的成员变量可以根据需要设置为final,要注意的是final类中的所有成员方法都会被隐式的指定为final方法。...原创 2019-07-25 14:40:00 · 96 阅读 · 0 评论 -
java高并发(六)线程安全性
定义:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。 线程安全性体现在以下三个方面: 原子性:提供了互斥访问,同一时刻只能有一个线程来对它进行操作。 可见性:一个线程对主内存的修改可以及时的被其他线程观察到。 有序性:一个线程观察其他线程中的指令执行...原创 2019-07-23 17:48:00 · 139 阅读 · 0 评论 -
java高并发(七)发布对象
发布对象 发布对象:是指使一个对象能够被当前范围之外的代码所使用。 对象逸出:一种错误的发布。当一个对象还没有构造完成时,就使它被其他线程所见。 我们经常需要发布一些对象例如通过类的非私有方法返回对象的引用,或者通过共有静态变量发布对象。 简单例子: @Slf4j @NotThreadSafe public class UnsafePublish { private Strin...原创 2019-07-24 17:33:00 · 113 阅读 · 0 评论 -
java高并发(五)并发模拟
在project-1中新建controller,TestController.java内容如下: @RestController @Slf4j public class TestController { @GetMapping("/test") public String test() { return "test"; } } 需要依赖Slf4j...原创 2019-07-22 17:04:00 · 118 阅读 · 0 评论 -
java高并发(四)并发编程与线程安全
代码有多个线程同时运行,而这些线程可能会同时运行同一段代码,如果每次运行的结果和单线程运行的结果是一样的,我们就认为是线程安全的。线程不安全就是线程不提供访问保护,有可能出现多个线程先后更改数据,造成所得到的数据是脏数据,也可能是计算时出现错误。 新建项目project-1,pom.xml文件内容如下: <?xml version="1.0" encoding="UTF-8"?...原创 2019-07-22 16:38:00 · 121 阅读 · 0 评论 -
java高并发(三)并发编程的基础
CPU多级缓存 为什么需要CPU缓存? 原因是,CPU的频率太快了,快到主存跟不上,这样在处理器时钟周期内,CPU常常需要等待主存,浪费资源。所以cache的出现,是为了缓解CPU和内存之间速度的不匹配问题。 CPU缓存有什么意义? 时间局部性:如果某个数据被访问,那么在不久的将来它很有可能被再次访问。 空间局部性:如果某个数据被访问,那么与它相邻的数据很快也可能被访问。 CPU多级缓存...原创 2019-07-22 15:14:00 · 89 阅读 · 0 评论 -
java高并发(二)并发与高并发基本概念
并发 同时拥有两个或者多个线程,如果程序在单核处理器上运行,多个线程将交替地换入或者换出内存,这些线程是同时“存在”的,每个线程都处于执行过程中的某个状态,如果运行在多核处理器上,此时,程序中的每个线程都将分配到一个处理器核上,因此可以同时运行。 高并发 高并发(High Concurrency)是互联网分布式系统框架设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行...原创 2019-07-22 11:37:00 · 97 阅读 · 0 评论 -
java高并发(二十一)高并发场景下缓存常见问题
缓存一致性 当数据实时性要求很高时,需要保证缓存中的数据与数据库中的数据一致,缓存节点与副本中的数据一致,不能出现差异现象,这就比较依赖缓存的过期和更新策略了。一般会在数据发生更改的时候,主动跟新缓存中的数据或者移除对应的缓存,这时可能会出现缓存一致性的问题。 现象一:更新数据库成功,更新缓存失败,数据不一致。 现象二:更新缓存成功,更新数据库失败,数据不一致。 ...原创 2019-08-02 15:56:00 · 246 阅读 · 0 评论