并发
E_N_T_J
这个作者很懒,什么都没留下…
展开
-
Lock.lock()为什么在try之前执行?
Java类库中提供了几种用于替代synchronized的锁,比如ReentrantLock、ReentrantReadWriteLock等,使用该锁时加锁与解锁的操作必须在代码中指定执行,通常会以如下方式使用:ReentrantLock lock = new ReentrantLock();lock.lock(); // 加锁try{ // do something}fina...原创 2020-05-06 08:53:28 · 5444 阅读 · 4 评论 -
JVM锁与锁优化
编码中进行锁优化:锁细化,减少锁持有的时间,在一个线程的代码之中,尽量不要对一个方法进行加锁,而是抽离出一个方法中的共享数据,只对方法中的这部分数据代码加锁,这样能减少加锁范围。防止在出现多线程竞争的时候,多个线程对同一个锁进行竞争,而持有锁的代码过长导致执行时间很长,处于阻塞状态的线程等待时间过长,阻塞状态的线程所处理的业务响应速度下降。 锁分离,根据代码同步操作的性质,分离锁,比如说,在...原创 2019-03-04 11:13:51 · 421 阅读 · 0 评论 -
并发编程(四)
AQS一、AQS介绍AQS:AbstractQueuedSynchronizer,即队列同步器。它是构建锁或者其他同步组件的基础框架(如ReentrantLock、ReentrantReadWriteLock、Semaphore等),JUC并发包的作者(Doug Lea)期望它能够成为实现大部分同步需求的基础。它是JUC并发包中的核心基础组件。二、AQS组件需要重点学习的组件有...原创 2020-03-12 16:47:10 · 214 阅读 · 0 评论 -
并发编程(三)
线程安全策略一、不可变对象不可变对象只要发布了,一定是线程安全的。满足什么条件是不可变对象?对象创建之后其状态不能修改 对象的所有域都是final修饰 对象是正确创建的(主要是指在创建期间,this引用没有逸出)如何创建一个不可变对象?自定义创建,讲类声明为final,这样类无法被继承;类中所有域声明为private;对变量不提供set方法,可变成员声明为final,通过...原创 2020-03-12 10:52:36 · 204 阅读 · 0 评论 -
并发编程(二)
安全发布对象一、什么是发布对象?使得一个对象在当前范围之外可见。比如通过公开方法返回一个对象的引用、通过类静态变量公布对象.与之对应的是逸出,指不正确的发布对象,比如将一个私有的对象发布出去,或者还没有正确构造完成对象,此对象就已经对外部可见二、如何安全地发布对象共有四种方式安全地发布对象在静态的自定义初始化函数中初始化(new)一个对象引用 将对象的引用保存到volat...原创 2020-03-11 20:01:08 · 185 阅读 · 0 评论 -
并发编程(一)
一、并发编程与高并发并发编程与高并发是两个不同的概念,并发编程是相对于以往单线程的编程模型,而采用多线程的编程模型,以充分利用CPU资源。高并发是一类场景,应用的并发请求量非常大的情景,为了解决高并发场景的问题,有很多技术手段,其中多线程并发编程模型是一种技术手段,还有包括扩容、缓存、队列、拆分、服务降级与熔断、数据库分库分表等等。并发的概念:同时拥有两个或更多的线程,如果是单核CPU,则...原创 2020-03-11 15:57:49 · 2425 阅读 · 0 评论 -
超卖问题及其解决方法
超卖问题介绍在高并发的场景下,比如商城秒杀活动中,一件商品的销售数量>库存数量的问题,称为超卖问题。主要原因是在高并发场景下,大量请求几乎同时到达,对库存资源进行竞争,由于没有适当的并发控制策略导致的错误。简单的下单操作如果没有并发的控制策略,则在下单时只需要考虑如下几步:查询库存数量、判断是否满足订单数量需求,提示库存不足或者减库存下单成功。通常我们会按照如下写法public Serve...原创 2020-03-02 16:51:34 · 11466 阅读 · 2 评论 -
MVCC
问题阅读《高性能MySQL》时读到MVCC这里,关于Innodb可重复读下的多版本并发控制介绍过于简单,因此很多细节被忽略后,导致一些情况难以理解,比如按照书中介绍的,如果表中有一条数据其事务版本号为1 name字段数据为li,此时有事务版本号为2的事务进行update操作但未提交,此时又有事务版本号为3的事务进行select * from table的操作得到该记录name为li,然后事务版本...原创 2020-02-16 21:20:11 · 274 阅读 · 0 评论 -
线程池介绍
一、为什么要用线程池1、使用线程池之前一开始接触多线程的时候,我们知道有三种方式可以创建多个线程,一种方式是继承Thread类本身;另外一种方式是实现Runnable接口;第三种方式是实现Callable接口并利用Future;线程无返回值的时候,一般通过实现Runnable接口来创建新的线程,而不是采用继承Thread类来实现多线程,因为java是单继承的,实现接口更加灵活;实现该接口需...原创 2019-12-12 17:00:32 · 163 阅读 · 0 评论 -
volatile关键字解析
volatile关键字能够保证对其修饰的变量进行 读取 或 写入 操作时是原子操作,且保证对其修饰的变量进行写入操作是具有先行发生原则的(即对其进行写入操作能够使得其它对该变量的读取操作读取到的变量值都是最新的),但是volatile并不能保证其它操作也是原子操作,仅仅是保证读取 写入操作而已。注意这个地方,很容易忽视这个定义导致出现异常。下面的代码中开了100个线程,每个线程都对n进行连续10次...原创 2019-10-31 11:28:50 · 150 阅读 · 0 评论