- 博客(16)
- 收藏
- 关注
原创 CopyOnWriteArrayList类小记
CopyOnwriteArrayList是JUC中提供的一个并发容器,它是一个线程安全且读操作无锁的ArrayList,写操作是通过创建底层数组的新副本来实现,实现了读写分离的并发策略。类似的容器还有CopyOnWriteSet。 实现原理:该容器允许并发读,读操作无锁,性能较高。写操作时,如向容器中添加一个元素,则**首先将当前容器复制一份,在新副本上添加新元素,最终再将原容器的引用指向新容器。所涉及写操作的方法均使用了 ReentrantLock **。 优缺点 优: Copy适合读多写少的并发场
2021-08-19 17:49:04
248
原创 多线程通信小记
文章目录1. 多线程编程步骤2. 线程虚假唤醒3. Intel 的 MESI 协议中的缓存一致性原理4. 并发编程三大基本概念与理解4.1 原子性4.2 可见性4.3 有序性 1. 多线程编程步骤 创建资源类,在资源类创建属性和操作方法 在资源类操作方法 判断 执行任务 通知 创建多个线程,调用资源类的操作方法 2. 线程虚假唤醒 如,现有诸多线程的唤醒的条件均为条件a,而其中某个线程(称线程A)的操作是将条件改为b,那么当条件a确定时,这些线程可能会被同时唤醒(notifyAll/sign
2021-08-13 10:32:21
338
原创 Lock 与 sychronize 简析
@[TOP] 1.1 与 synchronized 对比 Lock 锁实现提供了比使用同步方法和语句可以获得的更广泛的锁操作。它们允许更灵活的结构,可能具有非常不同的属性,并且可能支持多个关联的条件对象。Lock 提供了比 synchronized 更多的功能。 区别: Lock 非 Java 语言内置的是一个类, synchronized 是 Java 语言的关键字,incident是内置特性。 synchronized 不需要手动释放锁,当其修饰的部分执行完后,线程自动释放锁。Lock 必须手动释放锁
2021-08-11 11:20:11
947
原创 整数二分法查找
二分法查找的前提是序列“有序”。 二分法查找可以确定某种性质在序列中的边界。 当确定该性质的左边界时 ([l,r][l,r][l,r]被分为[l,mid][l,mid][l,mid]和[mid+1,r][mid+1,r][mid+1,r]) while (l < r) { int mid = l + r >> 1;//下取整 if (check(mid)) r = mid; else l = mid + 1; } 当确定该性质的右边界时 ([l,r][l,r][l,r]被分为[
2021-07-21 19:14:09
548
原创 CSAPP精读笔记-第1章 计算机系统漫游
第一章 计算机系统漫游 1.1信息即位+上下文 #include <stdio.h> int main() { printf("Hello World\n"); return 0; } 用C语言编写一个可以打印输出Hello World的程序,而这个程序的大致生命周期为创建、编译、运行和结束。其生命周期是从***源程序***开始的,文件名定为 hello.c 。源程序由文本字符组成,每个文本字符由字节表示,1字节为8位(8bits)。hello.c 程序是以字节序列的方式储存在
2021-07-15 00:23:10
632
原创 并发、并行、异步和同步之间的区别与联系
计算机并发(Concurrency),表示计算机能过同时进行多项任务 计算机并发方式有多种:如单核CPU分配时间片的方式,使不同的任务往复交替切换执行。该过程也叫进程或线程的上下文切换(context switching)。 但对于多核处理器,可通过任务分配多个核同时执行,即为并行(Parallelism) 同步(Synchronous),代表需要等到必须前一个任务执行完毕之后,才能进行下一个任务。因此在同步中,并没有并发或者并行的概念。 异步(Asynchronous),代表不同的任务之间并不会相互等待。
2021-05-15 17:20:24
1474
原创 使用AutoCloseable实现自动关闭资源
目录1 Autocloseable接口简介2 代码演示2.1 自定义类2.2 用例 1 Autocloseable接口简介 出现自jdk 1.7 一个可以一直保存资源(如文件或socket句柄)的直到关闭的对象。当退出try-with-resources块时,自动调用AutoCloseable对象的close()方法。这种构造确保了资源可以及时释放,避免了可能发生的资源耗尽异常和错误。 注意 对于必须完全通用地运行的代码,或当知道AutoCloseable实例需要释放资源时,建议使用try-with-re
2021-05-15 15:16:27
710
原创 Java 泛型自学笔记
文章目录Java 泛型一、概论1. 设计背景2. 概念二、集合中使用泛型三、自定义泛型结构四、泛型在继承上的体现五、通配符的使用 Java 泛型 一、概论 1. 设计背景 集合容器类在设计阶段/声明阶段不能确定这个容器倒是实际存的是什么类型的对象,所以在JDK1.5之前只能把元素类型设计为Object,JDK1.5后使用泛型来解决。因为这个适合除了元素的类型不确定,其他部分是确定的,例如关于这个元素如何保存,如何管理等是确定的,因此此时把元素的类型设计成一个参数,这个类型参数就是泛型。Collection,
2021-03-30 23:56:54
203
原创 Java 集合学习笔记
文章目录Java 集合(容器)一、Java 集合框架概述二、Collection 接口方法三、Iterator 迭代器接口1. 使用 Iterator 接口遍历集合元素2. Iterator 接口的方法3. 使用 foreach 循环遍历集合元素四、Collection 子接口一:List1. List 接口概述2. List 接口方法3. List 实现类之一:ArrayList(主要)4. List 实现类之二:LinkedList5. List 实现类之三:Vector6. List 三种实现类的异
2021-02-21 11:29:33
309
原创 Java枚举类与注解
Java枚举类与注解 一、枚举类 1. 枚举类的使用 类的对象只有有限个,确定的。我们称此类为枚举类 当需要定义一组常量时,强烈建议使用枚举类 如果枚举类种只有一个对象,则可以作为单例模式的实现方式 2. 如何自定义枚举类(jdk5.0之前) 步骤 声明自定义枚举类对象的属性:private final 私有化类的构造器,并给对象属性赋值 提供当前枚举类的多个对象: public static final 的 其他诉求如: 获取枚举类对象的属性, toString方法等 class Se
2021-02-04 11:12:40
387
原创 Java两个比较器
Java两个比较器 一、自然排序:Comparable接口 java.lang.Comparable Comparable 接口强行对实现它的每个类的对象进行整体排序(被称为,类的排序)。 重写 compareTo(Object obj) 方法的规则(两个对象通过该方法的返回值来比较大小): 如果当前对象this大于形参对象obj,则返回正整数; 如果当前对象this小于形参对象obj,则返回负整数; 如果当前对象this等于参数对象obj,则返回零。 //String类中对compareT
2021-02-02 11:51:00
797
1
原创 Java多线程基础知识笔记
多线程基础知识笔记 一、线程 1.基本概念 程序(program):是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。 进程(process):是程序的一次执行过程,或是正在运行的一个程序。是一个动态的过程:有它自身的产生、存在和消亡的过程(生命周期)。 进程作为资源分配的单位,系统在运行时会为每个进程分配不同的内存区域。 线程(tread):进程可以进一步细化为线程,是一个程序内部的一条执行路径。 若一个进程同一时间并行执行多个线程,就是支持多线程的。 线程作为调度
2021-01-24 15:02:21
260
原创 Java基础知识点总结笔记
Java基础 Java常用内存区域 栈内存空间:存储引用堆内存空间的地址 堆内存空间:保存每个对象的具体属性内容 全局数据区:保存static类型的属性 全局代码区:保存所有的方法定义 this关键字 表示该类的属性变量:this.变量名 调用本类的构造方法:this() 表示当前类,可调用成员方法:this.成原方法名() static关键字 声明属性,使之独立于对象,成为全局属性(亦称静态属性) 声明方法,使之成为"类方法",可直接通过类名调用:<类名>.<
2021-01-16 15:42:27
1499
2
原创 【C语言】关键路径/最长路径模拟实现
一、问题描述 1.拓扑排序: 在AOV网中为了更好地完成工程,必须满足活动之间先后关系,需要将各活动排一个先后次序即为拓扑排序。拓扑排序可以应用于教学计划的安排,根据课程之间的依赖关系,制定教学课程安排计划。按照用户输入的课程数,课程间的先后关系数目以及课程两两间的先后关系,程序执行后应该给出符合拓扑排序的课程安排计划。例如下图所示的课程优先关系: 程序执行后应该给出拓扑排序的结果为: (C1,C2,C3,C4,C5,C7,C9,C10,C11,C6,C12,C8) 或者(C9,C10,C11, C6,
2021-01-11 16:04:02
3794
4
转载 【C语言】数组名与取数组首地址的区别
一般情况下声明一个数组之后,比如int array[5],数组名array就是数组首元素的首地址,而且是一个地址常量。但是,在函数声明的形参列表中除外。 在C中, 在几乎所有使用数组的表达式中,数组名的值是个指针常量,也就是数组第一个元素的地址。 它的类型取决于数组元素的类型: 如果它们是int类型,那么数组名的类型就是“指向int的常量指针“。——《C和指针》 在以下两中场合下,数组名并不是用指针常量来表示,就是当数组名作为sizeof操作符和单目操作符&的操作数时。 sizeof返回整个数组的.
2020-09-02 15:23:43
765
原创 c语言-函数传递数组问题
题目:定义一个函数,使用二维数组作为传入参数,在主函数中输入4×4的二维数组,调用已定义的函数,把该矩阵传入,在主函数中输出结果。函数功能:使二维数组中两条对角线上的元素均为1,其余元素均为0。 解: int diagonal_assignment(int a[4][4]) { int i, j; for (i=0; i<4; i++) { for (j=0; j<4; j++) { if (i==j || i+j==3) { a[i][j] = 1; }else{
2020-05-31 13:42:34
1210
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅