随笔分类 - 并发编程
摘要:1、是什么? AQS就是一个工具类,算是在并发情况下规范了对“资源”或者说“数据”操作的一种机制或者说是规范。专业一点的叫法是:抽象队列同步器 2、这玩意干啥呢? AQS是给JAVA一系列锁以及同步器或者同步对象的底层提供了实现的框架,你也可以理解成为一种规范。就比如实现像ReentrantLock
阅读全文
摘要:1、ReentrantLock的实现原理 继承抽象类:抽象队列同步器 AbstractQueuedSychronizer https://blog.csdn.net/j1231230/article/details/120572008 2、ReentrantLock如何实现的公平锁 https://
阅读全文
摘要:(1)可重入性: 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大。 两者都是同一个线程没进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。 (2)锁的实现: Synchroniz
阅读全文
摘要:一、什么是CAS? 在计算机科学中,比较和交换(Conmpare And Swap)是用于实现多线程同步的原子指令。 它将内存位置的内容与给定值进行比较,只有在相同的情况下,将该内存位置的内容修改为新的给定值。 这是作为单个原子操作完成的。 原子性保证新值基于最新信息计算; 如果该值在同一时间被另一
阅读全文
摘要:二、synchronized关键字加锁: 必须掌握知识点: synchronized关键字底层原理:通过jvm指令,《深入理解jvm》,《并发编程艺术》page11 synchronized的几种加锁方式。 synchronized锁优化,不再是重量级了。 synchronized和reentran
阅读全文
摘要:1、线程池的几种工作队列? ArrayBlockingQueue LinkedBlockingQueue DelayQueue PriorityBlockingQueue SynchronousQueue (1)ArrayBlockingQueue ArrayBlockingQueue(有界队列)是
阅读全文
摘要:乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。
阅读全文
摘要:什么是ThreadLocal变量 ThreadLoal 变量,线程局部变量,同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本。这里有几点需要注意: 因为每个 Thread 内有自己的实例副本,且该副本只能由当前 Thread 使用。这是也是 ThreadLocal
阅读全文
摘要:主要从系统配置、前端、中间件、后端、数据库、监控 来说明。 https://juejin.cn/post/7044032901662375949
阅读全文
摘要:必会知识点: volatile关键字底层原理:并发编程的艺术page9 作用:保证可见性,保证有序性 应用:单例模式双重锁 一、volatile关键字: volatile是一种稍弱的同步机制,它在多线程开发中保证了共享变量的可见性。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修
阅读全文
摘要:一、线程的生命周期 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5 种状态。尤其是当线程启动以后,它不可能一直"霸占"着 CPU
阅读全文
摘要:一、JUC中的集合类--java.util.concurrent 下面,我们先了解JUC包中集合类的框架;为了方便讲诉,我将JUC包中的集合类划分为3部分来进行说明。在简单的了解JUC包中集合类的框架之后,后面的章节再逐步对各个类进行介绍。 1. List和Set JUC集合包中的List和Set实
阅读全文
摘要:从jdk5开始,把工作单元和执行机制分离开来。工作单元包括 Runnable 和 Callable,而执行机制由 Executor 框架提供。 一、Executor框架: 1、Executor框架两级调度模型: 在上层,java多线程程序把应用分解为若干个任务,然后执行用户级调度器,即Executo
阅读全文
摘要:1、继承Thread类创建多线程:继承java.lang.Thread类,重写Thread类的run()方法,在run()方法中实现运行在线程上的代码,调用start()方法开启线程。 Thread 类本质上是实现了 Runnable 接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过
阅读全文
摘要:一、锁 锁的实现有两种,一种是用synchronized关键字,另一种是lock接口,显示的加锁解锁。 二、synchronized关键字加锁: 锁——synchronized 三、lock接口加锁 在jdk 5之后,并发包中新增了Lock接口及相关实现类来实现锁功能。 Lock接口和synchro
阅读全文
摘要:相信大家在面试的时候,都经常会被问到这个问题 – “多线程的速度一定比单线程快吗”。这么问也就说明答案是否定的,而这道题的精髓就在于你能不能说出上下文切换这几个字。那什么是上下文切换呢? 上下文切换定义1:即使是单核的cpu也能够执行多线程,cpu通过给每个线程分配时间片来实现这个机制。时间片是cp
阅读全文
摘要:一、守护线程和本地线程及其区别: 1、java中的线程分为两种:守护线程(Daemon)和用户线程(User)。任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon(bool on);true则把该线程设置为守护线程,反之则为用户线程。Thread.setDaemon()
阅读全文
摘要:一、线程池及其原理 1、使用线程池的好处: (1)降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 (2)提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 (3)提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使
阅读全文
摘要:一、死锁 1、死锁:所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。 理解的例子: 生活中的一个实例,2个人一起吃饭但是只有一双筷子,2人轮流吃(同时拥有2只筷子才能吃)。某一个时候,一个拿了左筷子,一人拿了右筷子,2个人都同时占用一个资源,等待另
阅读全文