首先来区分一下什么是有界队列和无界队列 无界队列比如有ConcurrentLinedQueue,LinkedList,可以无限制的往里面去存放数据,再从队列里取数据。如果无限的塞入数据的话,可能会导致内存溢出 LinedBlockingQueue是一个链表的有界队列,有大小限制,如果超过了限制而往队列里面塞入数据的话就会被阻塞,它的好处就在于说可以限制内存队列的大小,避免说内存队列无限制的增长,最...

这里解释下为啥会得不到 10(知道的可直接跳过), i++ 这个操作,计算机需要分成三步来执行。 1、读取 i 的值。 2、把 i 加 1. 3、把 最终 i 的结果写入内存之中。 所以,(1)、假如线程 A 读取了 i 的值为 i = 0,(2)、...

简易web服务器 0.web服务器知识储备 1.简易web服务器-版本1 2.简易web服务器版本2-多线程版 3.1简易web服务器版本3-访问图片资源 3.2简易web服务器版本3-访问外链地址测试 4.简易web服务器-版本4-连接池版 0.web服务器知识储备 web服务器知识储备,了解网络编程,其实就是java的socket。如果实现网络请求,也就是服务端能够接收客户端的请求,然后服务端...

文章目录 重排序 什么是重排序 数据依赖性 as-if-serial语义 指令重排序分类 重排序会产生什么问题 happen-before概述 ·1)程序顺序规则: ·2)监视器锁规则: ·3)volatile变量规则: ·4)传递性: 5)start()规则: 6)join()规则: 锁的内存语义 1.锁的释放-获取建立的happens-b...

文章目录 一.synchronized的缺陷 二.java.util.concurrent.Lock包下常用的类 1.Lock 2.ReentrantLock 3.ReadWriteLock 4.ReentrantReadWriteLock 5.Lock和synchronized的选择 三.锁的相关概念介绍 1.可重入锁 2.可中断锁 3.公平锁 4.读写锁 四.总结 1.用法比较 2.特性比较 ...

线程池 1、三大方法 2、七大参数 我们通过阅读源码可以发现,上面创建线程池的方法底层都是调用ThreadPoolExecutor这个方法进行的,它又七个参数。 以银行办业务为例解释一下这七大参数。 图1 图2 3、四种拒绝策略 4、自定义线程池 测试 5、如何合理的设置最大线程数? 分析下线程池处理的程序是CPU密集型,还是IO密集型 (1)CPU密集型 CPU密集型也叫计算密集型,指的是系统的...

线程的基本介绍 什么是线程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。 进程的执行逻辑 为什么会有线程 多线程的本质是:合理的利用多核心CPU资源来实现线程的并行处理,来实现同一个进程内的多个任务的并行执行,同时基于线程本身的异步执行特性,提升任务处理的效率。 在多核CPU中,利用多线程可以实现真正意义上的并行执行 在一个应用进程中,会存在多个同时执行的...

1、ReadWriteLock 2、BlockingQueue (1)队列 队列的特点:先进后出,对头出,对尾入。 什么时候会发生阻塞? 对列已满,但还想再入队列 队列为空,想要出队列 (2)阻塞队列的继承关系 (3)使用 四组API 方法 抛出异常 不抛出异常 阻塞等待 超时等待 添加 add offer put offer (参数可以设置阻塞时间) 移除 remove poll take po...

死锁及其解决

并发编程  并发编程

  

2020-05-23 18:10:39

1、死锁概述 锁在开发中会经常用到,使用起来也是非常简单。但是如果业务比较复杂,使用不当的话,会出现死锁, 这是非常严重的问题。下面代码会造成死锁。 在一些复杂的场景下,可能会出现上述情况。 究其原因,t1因为某些情况没有释放掉A锁,t2在获取B锁的情况下去拿A锁,此时A锁被占用拿不到,t1在释放掉A锁的情况下,去拿B锁,此时B锁又被t2占有。导致t1,t2相互占用对方待获取的锁,且又互不相让,形...

并发编程之死锁

并发  并发编程

  

2019-12-16 15:35:15

什么是死锁? 死锁指的是某个资源占用后,一直得不到释放,导致其他需要这个资源的线程进入阻塞状态。 产生死锁的4个必要条件 互斥条件:在一段时间内某资源仅为一个线程所占有。 不可剥夺条件:线程所获得的资源在未使用完毕之前,不能被其他线程强行夺走。 请求和保持条件:线程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他线程占有。 循环等待条件:存在一种线程资源的循环等待链,链中每一个线程...

  AQS框架图 上图是AQS框架大致的一些方法,还有一些没有全部的列出来。这里主要是让大家从这张图中,对AQS有一个总体的印象。总的来说AQS框架分为五层从对外暴露的API层到底层的数据层,当自定义同步器时候,只需要实现API的方法即可,不需要关注底层的具体实现逻辑。 共享模式和独占模式流程图对比 独占模式流程图 共享模式流程图 相同点 从流程图中,我们发现独占模式和共享模式,在竞争失...

AQS 共享锁模式

并发  并发编程  java

  

2020-04-17 02:08:06

前沿 上一篇文章已经向大家讲解了AQS的数据结构,以及独占锁的源码详解,本篇文章接着介绍AQS的共享锁模式,学习并发编程一定要把AQS搞懂,因为JUC包中的很多类都是由AQS实现的。 AQS共享模式acquireShared执行流程 多个线程通过调用tryAcquireShared方法获取共享资源,返回值大于等于0则获取资源成功,返回值小于0则获取失败。 当前线程获取共享资源失败后,通过调用add...

  1、Synchronized 关键字 (1)说一说自己对于 synchronized 关键字的了解    Synchronized 关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证它修饰的方法或代码块在任意时刻只能有一个线程执行。    另外,在 Java 早期版本中,synchronized属于重量级锁,效率...

前言 并发,这是一个值得深思的话题。它似无形却有形。我们平常的工作都是面向业务编程,CRUD居多,基本上与并发没什么交集。ok,并发是一个广泛的概念。那么咱们来聊聊多线程(java 多线程)。这里咱们来思考下问题:为什么要使用多线程?俗话说,一方有难八方支援。在今年的疫情初期,武汉的疫情非常严峻,如果仅靠武汉的白衣天使来医治病患,这无疑是一个长征项目,这就等同于单线程在干活。于是一批批来自于五湖四...