solr 高并发_精妙绝伦!阿里资深架构师撰写这份:并发编程,可谓“独具匠心”...

写在前面

并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能。现在几乎100%的公司不但面试都必须问到并发编程,而且在日常工作和开发当中更是需要并发编程的使用,尤其是在互联网公司,它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰、思维缜密,这样才能写出高效、安全、可靠的多线程并发程序。

并发编程笔记

计算机领域从来都不乏变革,每一次都带来新的机遇与挑战。“并发编程” 无疑是一场令人激动的变革。迎接技术变革与挑战,是软件开发者的空气和水。很高兴你已经读到了这里,那么请不要停下来,继续享受挑战的乐趣,继续面对这场变革,前进吧!

  • 进程
  • 线程
  • 并发
  • 并行

329f6187017a082aad72f718eb6e088d.png

d9c9cf5c8fa62d4e3f5b4cbb28809196.png

进程与线程

进程

  1. 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理IO的
  2. 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。
  3. 进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器等),也有的程序只能启动一个实例进程(例如网易云音乐、360 安全卫士等)

线程

  1. 一个进程之内可以分为到多个线程。
  2. 一个线程就是一个指令流 ,将指令流中的一条条指令以一定的顺序交给CPU执行
  3. Java中,线程作为最小调度单位,进程作为资源分配的最小单位。 在windows中进程是不活动的,只是作为线程的容器

并行与并发

0a5935bea83ad0bf56beade61950dea5.png

(由于内容太多了,为了不影响大家的阅读体验,以下大量内容省略......Σ( ° △ °|||)︴)

并发编程共享模型篇

共享模型之管程

共享带来的问题

bf658bc5dc9fa84660363dd231bd8cc2.png

33b22ef6743638e0381fa342d94bf3e8.png

acde9f403ec73528759e5215f4a93127.png

共享模型之内存

退不出的循环

51727b85796a8f985fe0c34dfadb4a81.png

共享模型之无锁

CAS与volatile

7ee43be2101bf6dbfd474f898cb1c4c2.png

2daeaeb2d09e066e18267f68626d17ea.png

CAS的特点

1fedd5029c51eb6490d95c93575c6d79.png

共享模型之不可变

日期转换的问题

7aad077f7e33ccb46f1bd74d891a13af.png

共享模型之工具

线程池

427c015ad691835de2bf21c860ef1e10.png

ThreadPoolExecutor

84a1d8241af741d437306822c7ed1640.png

Executor线程配置

5a5f25cf5c8455e60153fd70ca04d3ac.png

线程安全集合类概述

86f91ec8e911d16768679ae0694eac97.png

并发编程之原理篇

指令级并行原理

1af5521c637520ba015915482d6f6cf9.png

5d91b37265d0a93b9c1db5a7fdb566ba.png

SuperScalar处理器

c251b7a94d6205dd87587d64d4e318bc.png

CPU缓存结构原理

.CPU缓存结构

2bbca90dcf4e9313825815e8f2e8b21e.png

19bf58017eae61e326116a45c31cae2a.png

CPU缓存一致性

MESI协议

  • E、 S、M状态的缓存行都可以满足CPU的读请求
  • E状态的缓存行,有写请求,会将状态改为M,这时并不触发向主存的写
  • E状态的缓存行,必须监听该缓存行的读操作,如果有,要变为S状态

0f15961669e484c53ef1c6a99a1b51ab.png

volatile原理

volatile的底层实现原理是内存屏障,Memory Barrier ( Memory Fence )

  • 对volatile变量的写指令后会加入写屏障
  • 对volatile变量的读指令前会加入读屏障

如何保证可见性

1c6caffd3d6293a607401f0e2e276fb2.png

19c397936aa9b87f2515d1bf583e20e3.png

final原理

9939bfe2a5241d653ebd6a524f61aee0.png

Monitor原理

Monitor被翻译为监视器或管程

每个Java对象都可以关联一个Monitor对象,如果使用synchronized给对象上锁(重量级)之后,该对象头的Mark Word中就被设置指向Monitor对象的指针

c90d32f9c557096aa8d863f1fe0992ac.png

synchronized原理进阶

轻量级锁

  • 轻量级锁的使用场景:如果一个对象虽然有多线程要加锁,但加锁的时间是错开的(也就是没有竞争) , 那么可以使用轻量级锁来优化。
  • 轻量级锁对使用者是透明的,即语法仍然是synchronized
  • 假设有两个方法同步块利用同一个对象加锁

c98cf504abf3848c0ee8b7357d24646a.png

cc65184c852b7fa2a75a0c47eb23b122.png

bcccd6739737e1079579a40e904b9616.png

自旋优化

重量级锁竞争的时候,还可以使用自旋来进行优化,如果当前线程自旋成功(即这时候持锁线程已经退出了同步块,释放了锁), 这时当前线程就可以避免阻塞。

44664b90468fcfd8979ecca41093eb69.png

937e62d6c2f8f722161ae045c795de7f.png

偏向锁

  • 轻量级锁在没有竞争时(就自己这个线程), 每次重入仍然需要执行CAS操作。
  • Java 6中引入了偏向锁来做进一步优化: 只有第一次使用CAS将线程ID设置到对象的Mark Word头之后发现这个线程ID是自己的就表示没有竞争,不用重新CAS。以后只要不发生竞争,这个对象就归该线程所有

9819af0fad1980b7d080b2d09db15b2b.png

34ff32d89754bd08065bcfafd98ed645.png

wait notify原理

67270640a5fcf4194f3571be177b51b3.png

park unpark原理

每个线程都有自己的一一个Parker对象

  • 线程就像一个旅人,Parker就像他随身携带的背包,条件变量就好比背包中的帐篷。counter 就好比背包中的备用干粮(0为耗尽,1为充足)
  • 调用park就是要看需不需要停下来歇息
如果备用干粮耗尽,那么钻进帐篷歇息.
如果备用干粮充足,那么不需停留,继续前进
  • 调用unpark,就好比令干粮充足
如果这时线程还在帐篷,就唤醒让他继续前进
如果这时线程还在运行,那么下次他调用park时,仅是消耗掉备用干粮,不需停留继续前进

878b4240824ad94f62e47fecd92f1f1a.png

a6a16cbc407e0afd7832ff8a051ba1a1.png

ReentrantLock原理

bfed9d970c95105e5509986b7ebf8c7b.png

44a2c1fbeff51eb9ec9775f1b1f677e6.png

条件变量实现原理

每个条件变量其实就对应着一个等待队列 ,其实现类是ConditionObject

b0aaee0c35960c322c27b16a596c85d0.png

7fb6fdc2c04703a93608a9a132e9102b.png

b5ce7de4d474f6d0ed84aa013478df9d.png

读写锁原理

a9ec1347270eff177e805781f26e5012.png

fe70643c9a18837ba5f3fac0412b0a99.png

3e402e026d5d6c733d9ab689fa64e409.png

(以上省略大量图文内容.......,Σ( ° △ °|||)︴)

Semaphore原理

Semaphore有点像一个停车场, permits就好像停车位数量,当线程获得了permits就像是获得了停车位,然后停车场显示空余车位减一

39695f8774b7f136b0da9109abb212f2.png

fd9824210748f388da986efd2591e775.png

为什么要有PROPAGATE

cb707dc2fc823b7b6db9625b82edfe80.png

5d2eddb6a10d5a408f376fc4b87b66bf.png

LinkedBlockingQueue原理

a0fb12aabe74c3167743f9d59097e38f.png

176f0ae8da225e7569b7dbd2e222ba81.png

并发编程之模式篇

同步模式之保护性暂停

即Guarded Suspension,用在一个线程等待另一个线程的执行结果

要点

  • 有一个结果需要从一个线程传递到另一个线程,让他们关联同一个GuardedObject
  • 如果有结果不断从一个线程到另一个线程那么可以使用消息队列(见生产者/消费者)
  • JDK中, join的实现、Future的实现,采用的就是此模式
  • 因为要等待另一方的结果,因此归类到同步模式

a520f83ebfcf5bd2679f0f776d3498da.png

同步模式之顺序控制

固定运行顺序

ab7f47ad0790ac4b39e365ba88a9d23d.png

交替输出

1fbf1fa855e8a360567132915b20bfca.png

异步模式之生产者/消费者

定义

450e5e8416145acccd3e833b3878807b.png

异步模式之工作线程

创建多少线程池合适

e9f2154d2a9a1abd9dc072a5a1c111ce.png

自定义线程池

ef7041b651fb130c6d9047647d4ab3c6.png

终止模式之两阶段终止模式

两阶段终止模式

b6a6676cbe5f1215bc51ab8027c41ceb.png

线程安全单例

7b132bb4e3947f48ef0706972adb5467.png

享元模式

668c1ba7cb7295556e929176c79ef793.png

BATJ并发编程高频面试题

  1. 现在几乎100%的公司面试都必须面试并发编程,尤其是互联网公司,对于并发编程的要求更高,并发编程能力已经成为职场敲门砖。
  2. 现在已经是移动互联和大数据时代,对于应用程序的性能、处理能力、处理时效性要求更高了,传统的串行化编程无法充分利用现有的服务器性能。
  3. 并发编程是几乎所有框架的底层基础,掌握好并发编程更有利于我们学习各种框架。想要让自己的程序执行、接口响应、批处理效率更高,必须使用并发编程。
  4. 并发编程是中高级程序员的标配,是拿高薪的必备条件。

借用Java并发编程实践中的话”编写正确的程序并不容易,而编写正常的并发程序就更难了”,相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作的顺序是不可预期的,下面算是对多线程情况下同步策略的一个简单介绍。

126a720d8df106980b1cd7eec00959e1.png

19d6a4740beb9a1d056d3ffac86317d4.png

b5eb6f5d4cc3a1e1ba8d2832e32ec5c1.png

这份【并发编程】【并发编程之模式篇】【并发编程之原理篇】【并发编程之应用篇】文档共有390页,需要完整版的朋友,可以点赞此文关注小编后,【见下图】来获取!!

d2a8b00e02029f58afede0333326bc3a.png

当然,单单有文档看是远远不够的,还有视频和相匹配的课件进行学习提升,努力把并发编程这一块儿给搞明白,相信一定会有不凡的人生!!

多线程与高并发学习视频

bfdabb19ec2751446afe809d9ba3e935.png

多线程与高并发视频课件分享

b9af13ccaaaf7e5fbc70fec462663133.png

01f1eef2e91eb22a0f83017de4b20509.png

多线程与高并发视频和课件获取,关注小编,【见下图】即可获取!

d2a8b00e02029f58afede0333326bc3a.png

好了,今天就分享到这里了,希望大家能够好好学习,把并发编程这一块儿给提升上来,也希望本文能够得到大家的喜欢!!

Solr基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎 课程特点毕业后接触的第一个中间件就是Solr,在工作中用处广泛,为了便于大家快速掌握该技能,开始录制相关课程,该专栏特点如下:1.采用Solr最新版本视频录制,全网最新课程(Solr8.1于2019年5月16日发布)2.技能点全网最全,会结合工作经验,项目中用到的技能点都会有所涉及,更新章节比较全面3.适用范围广,从零基础到高级架构以及分布式集群都涵盖,适用初级、高级、项目实战等多个层次开发者4.多种维度辅助学习,采用独立solr粉丝群辅助教学,学员问题会及时得到解决,程序员突破圈 打卡制度,督促学员学习关注后再购买、 关注后再购买、 关注后再购买课程能得到什么1.快速学习到最新版本的全文检索技术,从视频、文章、圈子、粉丝交流等快速促进学习2.通过该技术,获得面试进阶指导3.结交人脉(庞大的粉丝群)..End初期学员100人,价格不会太高,也是为了帮助更多的开发者但是个人精力有限,所以限制条件如下1.求知欲强,有想向技术更深一层了解的2.乐于交流,喜欢探讨技术者3.学习惰性者慎入,购买后会督促大家学习,购买不是目的,学习到该技能才是该专栏的主要目的正式进入学习状态了吗,专栏群见。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值