随笔分类 -  JUC

摘要:一、读写锁ReentrantReadWriteLock 1、基本概念 读写锁ReentrantReadWriteLock,一个资源能够被多个读线程访问,或者被一个写线程访问,但是不能同时存在读写线程。它并不是真正意义上的读写分离,它只允许读读共存,而读写和写写依然是互斥的。 一个ReentrantR 阅读全文
posted @ 2022-01-12 17:23 幻月hah 阅读(154) 评论(0) 推荐(0) 编辑
摘要:一、公平、非公平锁的区别 通过ReentrantLock的源码来讲解公平锁和非公平锁。 公平锁与非公平锁的lock()方法唯一的区别就在于公平锁在获取同步状态时多了一个限制条件:hasQueuedPredecessors(),它是公平锁加锁时判断等待队列中是否存在有效节点的方法。 公平锁:公平锁讲究 阅读全文
posted @ 2022-01-11 16:00 幻月hah 阅读(68) 评论(0) 推荐(0) 编辑
摘要:一、什么是AQS 1.1 概念 AbstractQueuedSynchronizer抽象同步队列,其定义了一套多线程访问共享资源的同步器框架,通过内置的FIFO队列来完成资源获取线程的排队工作,并通过一个int类变量表示持有锁的状态。 1.2 基石 很多同步类实现都依赖于AQS,如常用的Reentr 阅读全文
posted @ 2022-01-11 15:16 幻月hah 阅读(92) 评论(0) 推荐(0) 编辑
摘要:锁升级的流程:无锁 -> 偏向锁 -> 轻量锁(CAS)-> 重量级锁 一、偏向锁 1.1撤销和升级 1、偏向锁只有遇到其他线程尝试竞争偏向锁时,持有偏向锁的线程才会释放锁,线程是不会主动释放偏向锁的。 2、撤销需要等待全局安全点(该时间点上没有字节码正在执行),同时检查持有偏向锁的线程是否还在执行 阅读全文
posted @ 2022-01-08 16:24 幻月hah 阅读(211) 评论(0) 推荐(0) 编辑
摘要:一、对象的构成 二、对象头 对象头的大小,在64位系统中,Mark Word占了8个字节,类元信息占了8个字节,一共是16个字节。 2.1、对象标记Mark Word 2.2、类元信息Class Pointer 对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。 三、实例数 阅读全文
posted @ 2022-01-07 16:47 幻月hah 阅读(52) 评论(0) 推荐(0) 编辑
摘要:一、什么是内存泄露 不再会被使用的对象或者变量占用的内存不能被回收,就是内存泄露。 二、强引用 概念: 当内存不足,JVM开始垃圾回收,对于强引用的对象,就算是出现了OOM也不会对该对象进行回收,死都不收。 强引用是我们最常见的普通对象引用,只要还有强引用指向一个对象,就能表明对象还“活着”,垃圾收 阅读全文
posted @ 2022-01-02 01:23 幻月hah 阅读(145) 评论(0) 推荐(0) 编辑
摘要:一、什么是ThreadLocal ThreadLocal,提供线程局部变量。这些变量与正常的变量不同,因为每个线程在访问ThreadLocal实例的时候(通过其get或set方法)都有自己的、独立初始化的变量副本。ThreadLocal实例通常是类中的私有静态字段,使用它的目的是希望将状态(例如,用 阅读全文
posted @ 2021-12-31 16:29 幻月hah 阅读(51) 评论(0) 推荐(0) 编辑
摘要:LongAdder,在无竞争的情况下跟AtomicLong一样,对同一个base进行操作。当出现竞争关系时则是采用化整为零的做法,用空间换时间,用一个数组cells,将一个value拆分进这个数组cells。多个线程需要同时对value进行操作时候,可以对线程id进行hash得到hash值,再根据h 阅读全文
posted @ 2021-12-30 17:24 幻月hah 阅读(153) 评论(0) 推荐(0) 编辑
摘要:使用目的: 以一种线程安全的方式操作非线程安全对象内的某些字段。 优点: 不用对对象加锁,只针对对象的某个属性进行原子类操作,提高并发性。 使用方式: 1、更新的对象属性必须使用public volatile修饰符。 2、因为对象的属性修改类型原子类都是抽象类,所以每次使用都必须使用静态方法newU 阅读全文
posted @ 2021-12-30 15:54 幻月hah 阅读(73) 评论(0) 推荐(0) 编辑
摘要:一、什么是CAS Compare And Swap的缩写,中文翻译成比较并交换,实现并发算法时常用到的一种技术。它是一条CPU的原子指令,包含三个操作数——内存位置、预期原值及更新值。 执行CAS操作的时候,将内存位置的值与预期原值比较。 如果相匹配,那么处理器会自动将该位置值更新为新值。 如果不匹 阅读全文
posted @ 2021-12-28 17:27 幻月hah 阅读(69) 评论(0) 推荐(0) 编辑
摘要:一、被volatile修饰变量的两大特点 可见性。 有序性。 二、语义 当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值立即刷新回主内存中。 当读一个volatile变量时,JMM会把该线程对应的本地内存设置为无效,直接从主内存中读取共享变量。 所以volatile的写内 阅读全文
posted @ 2021-12-24 10:51 幻月hah 阅读(58) 评论(0) 推荐(0) 编辑
摘要:一、什么是JMM? 因为CPU运算速度远大于物理主存,CPU运行时并不是直接操作内存而是先把内存里面的数据读到缓存,因此内存的读和写操作就会造成不一样的问题。 Java虚拟机规范中试图定义一种Java内存模型(java Memory Model,简称JMM)来屏蔽掉各种硬什和操作系统的内存访问差异, 阅读全文
posted @ 2021-12-23 15:06 幻月hah 阅读(95) 评论(0) 推荐(0) 编辑
摘要:一、Object的wait、notify 注: 1、wait、notify必须绑定synchronized使用。 2、wait、notify有先后顺序,必须先等待后唤醒。 3、wait后,会释放锁。 public class TestDemo01 { static Object obj = new 阅读全文
posted @ 2021-12-22 18:42 幻月hah 阅读(215) 评论(0) 推荐(0) 编辑
摘要:一、什么是中断? 首先, 一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。所以,Thread.stop、Thread.suspend、Thread.resume都已经被废弃了。 其次, 在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。 因此 阅读全文
posted @ 2021-12-22 17:04 幻月hah 阅读(83) 评论(0) 推荐(0) 编辑
摘要:public class test { public static void main(String[] args) { Phone phone = new Phone(); new Thread(() -> { phone.sendEmail(); }).start(); new Thread(( 阅读全文
posted @ 2021-12-22 11:43 幻月hah 阅读(40) 评论(0) 推荐(0) 编辑
摘要:一、悲观锁 概念:在获取数据时会先加锁,确保数据不会被别的线程修改。 场景:适合写操作多的场景,先加锁可以保证写操作时数据正确。 实现:synchronized关键字和Lock的实现类都是悲观锁。 二、乐观锁 概念:获取数据时认为不会有别的线程修改数据,所以不会上锁,但是在更新时会判断有没有别的线程 阅读全文
posted @ 2021-12-21 17:20 幻月hah 阅读(124) 评论(0) 推荐(0) 编辑
摘要:注: 方法名以”Async“结尾的区别:(如thenApply和thenApplyAsync) thenApply:当前任务的线程继续执行“thenApply”的任务。 thenApplyAsync:把“thenApplyAsync”这个任务继续交给线程池来进行执行。 一、获得结果和触发计算 1、获 阅读全文
posted @ 2021-12-21 15:44 幻月hah 阅读(834) 评论(0) 推荐(0) 编辑
摘要:一、基础 Future:Future接口定义了操作异步任务执行的方法,如获取任异步任务的执行结果、取消异步任务的执行、判断任务执行是否完毕等。 Callable:Callable接口定义了需要有返回结果的任务需要实现的方法。 二、Future的缺点。 阻塞。必须手动futureTask.get()查 阅读全文
posted @ 2021-12-20 17:29 幻月hah 阅读(186) 评论(0) 推荐(0) 编辑
摘要:为什么要使用多线程? 1、硬件方面:硬件发展技术到达瓶颈,cpu主频已经无法提升,现在采用多核而不是更快的主频。想让程序更快就要采用并行或并发编程。 2、软件方面:高并发系统,处理异步+回调等生产需求。充分应用多核cpu优势。 一、进程 进程Process是计算机中的程序关于某数据集合伤的一次运行活 阅读全文
posted @ 2021-12-20 11:48 幻月hah 阅读(85) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示