
JavaSE
文章平均质量分 80
学习笔记
阿瞒有我良计15
这个作者很懒,什么都没留下…
展开
-
黑马程序员——mysql——day05——反射、注解、动态代理
目标了解反射技术的作用 【了解】讲解反射的概述反射技术的作用目标能够理解注解在程序中的作用 【了解】讲解什么是注解注解的作用目标能够熟悉自定义注解的格式 【会用】讲解注解的定义格式定义带有属性的注解定义注解使用关键字:@interfacepublic @interface 注解名{//内容注解本质上就是一个接口。所有注解都会继承一个接口:Annotationpublic interface 自定义注解名 extends java.lang.annotation.Annotation {}概念。原创 2024-04-18 09:06:49 · 891 阅读 · 0 评论 -
黑马程序员——javase进阶——day13——黑马云盘
协议就是客户端和服务端通讯双方共同遵守的规定。TCP协议是区分客户端服务端的一个比较底层的协议,传输的数据是字节码数据,如下当客户端连接服务端后,若要上传一个文件到服务端。直接将文件数据传给服务端,那么服务端该如何识别这个数据呢。对于服务端来讲收到的都是字节数据,服务端该如何识别客户端的操作意图,如果是上传文件,那么文件的类型是什么,文件的名字是什么等等信息。怎样让双方在沟通时理解对方的信息呢?我们可以把要发送给对方的数据前加一行描述信息,我们可以称为头信息。原创 2024-03-22 15:16:50 · 983 阅读 · 0 评论 -
黑马程序员——javase进阶——day12——网络编程
在网络通信协议下,不同计算机上运行的程序,可以进行数据传输单元测试就是编写测试代码,可以准确、快速地保证程序的正确性,Junit是Java单元测试的框架。JUnit4可以通过注解的方式来标记方法 , 让方法存某种意义 ,常见的注解有:@BeforeClass 全局只会执行一次,而且是第一个运行(标记的方法需要是一个静态无参无返回值方法)@Before 在测试方法运行之前运行(非静态无参无返回值方法)@Test 测试方法(此方法必须是非静态无参无返回值方法), 主要用于测试的方法。原创 2024-03-22 09:44:40 · 1063 阅读 · 0 评论 -
黑马程序员——javase进阶——day11——字符流,编码表,对象流,其他流
计算机中储存的信息都是用二进制数据表示的;我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果按照编码表规则,将字符存储到计算机中,称为编码。按照同样的编码表规则,将存储在计算机中的二进制数据解析显示出来,称为解码。编码和解码使用的码表必须一致,否则会导致乱码。简单理解:存储一个字符a,首先需在码表中查到对应的数字是97,然后按照转换成二进制的规则进行存储。称为编码读取的时候,先把二进制解析出来,再转成97,通过97查找早码表中对应的字符是a。原创 2024-03-20 15:58:32 · 934 阅读 · 0 评论 -
黑马程序员——javase进阶——day10——IO流,Properties集合,IO工具类
通过变量,数组,或者集合存储数据都是不能永久化存储 , 因为数据都是存储在内存中只要代码运行结束,所有数据都会丢失使用IO流1,将数据写到文件中,实现数据永久化存储2,把文件中的数据读取到内存中(Java程序)I 表示intput ,是数据从硬盘进内存的过程,称之为读。O 表示output ,是数据从内存到硬盘的过程。称之为写IO的数据传输,可以看做是一种数据的流动,按照流动的方向,以内存为参照物,进行读写操作简单来说:内存在读,内存在写字节输入流类。原创 2024-03-19 14:46:06 · 1020 阅读 · 0 评论 -
黑马程序员——javase进阶——day09——线程安全,死锁,状态,通讯,线程池
死锁是一种少见的,而且难于调试的错误,在两个线程对两个同步锁对象具有循环依赖时,就会大概率的出现死锁。我们要避免死锁的产生。否则一旦死锁,除了重启没有其他办法的其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。原创 2024-03-18 15:01:47 · 1042 阅读 · 0 评论 -
黑马程序员——javase进阶——day08——异常,多线程,Lambda,Stream,File,递归
异常就是程序出现了不正常情况 , 程序在执行过程中 , 数据导致程序不正常 , 最终导致了JVM的非正常停止注意 : 语句错误不算在异常体系中当JDK中的异常类型,不满足实际的业务需要时。就可以自己定义异常。例如,学生的年龄数据,如果是负数或者数据 超过了150认为是不合法的,就需要抛出异常。JDK中就没有表示年龄的异常,就需要自己定义异常了如果要自定义编译时异常,就继承Exception如果要自定义运行时异常,就继承RuntimeException是指从软件或者硬件上实现多个线程并发执行的技术。原创 2024-03-17 19:48:33 · 1039 阅读 · 0 评论 -
黑马程序员——javase进阶——day07——日志框架、阶段项目
想清楚的知道一个系统运行的过程和详情怎么办?日志生活中的日志:生活中的日志就好比日记,可以记录你生活的点点滴滴。程序中的日志:程序中的日志可以用来记录程序运行过程中的信息,并可以进行永久存储。以前记录日志的方式输出语句的弊端信息只能展示在控制台不能将其记录到其他的位置(文件,数据库)想取消输出语句需要修改代码才可以完成日志技术具备的优势可以将系统执行的信息选择性的记录到指定的位置(控制台、文件中、数据库中)。可以随时以开关的形式控制是否记录日志,无需修改源代码。原创 2024-03-15 09:50:10 · 1048 阅读 · 1 评论 -
黑马程序员——javase进阶——day06——排序查找算法,Map,集合嵌套
在 JDK5 中提供了可变参数,允许在调用方法时传入任意个参数。可变参数原理就是一个数组形式存在格式 : 修饰符 返回值类型 方法名(数据类型… 变量名) { }举例 : public void show(int ... num) : 表达式该方法可以接收任意个整数值 , 原理 : 其实就是一个int类型的数组java.util.Map 集合,里面保存的数据是成对存在的,称之为双列集合。存储的数据,我们称为键值对。之前所学的Collection集合中元素单个单个存在的,称为单列集合。原创 2024-03-08 10:35:59 · 909 阅读 · 0 评论 -
黑马程序员——javase进阶——day05——泛型,数据结构,List,Set集合
泛型是一种类型参数,专门用来保存类型用的最早接触泛型是在ArrayList,这个E就是所谓的泛型了。使用ArrayList时,只要给E指定某一个类型,里面所有用到泛型的地方都会被指定对应的类型当一个类定义其属性的时候,不确定具体是什么类型时,就可以使用泛型表示该属性的类型定义的格式在类型名后面加上一对尖括号,里面定义泛型。一般使用一个英文大写字母表示,如果有多个泛型使用逗号分隔public class 类名{ ... }举例 :X xObj;泛型的确定。原创 2024-03-07 13:58:31 · 910 阅读 · 0 评论 -
黑马程序员——javase进阶——day04——正则表达式 , Collection集合
概述 : java.math.BigInteger类是一个引用数据类型 , 可以用于计算一些大的整数 , 当超出基本数据类型数据范围的整数运算时就可以使用BigInteger了。概述 : java.math.BigDecimal可以对大浮点数进行运算,保证运算的准确性。float,double 他们在存储及运算的时候,会导致数据精度的丢失。如果要保证运算的准确性,就需要使用BigDecimal。原创 2024-02-19 18:15:03 · 1024 阅读 · 0 评论 -
黑马程序员——javase进阶——day03——多态 , 常用API
一个对象在不同时刻体现出来的不同形态举例 : 一只猫对象我们可以说猫就是猫 : Cat cat = new Cat();我们也可以说猫是动物 : Animal cat = new Cat();这里对象在不同时刻,体现出来的不同形态 , 我们就可以理解为多态一个A类 中 定义一个B类 , 那么B类就属于A类的内部类 , A类就属于B类的外部类public Date(): 创建的对象,表示的是当前计算机系统的时间。原创 2024-01-27 20:55:23 · 959 阅读 · 0 评论 -
黑马程序员——javase进阶——day02——关键字,接口,代码块,枚举
接口 : 如果一个类中都是抽象方法 , 那么这个类应该是定义规则的类 , 我们应该把此类定义成接口,接口是一种引用数据类型作用 :用于定义规则程序的扩展性定义接口的关键字使用interfacepublic interface 接口名{ ... }类与接口之间的关系是实现关系 , 用关键字implements进行连接public class 类名 implements 接口名 { ... }接口不能实例化接口的子类我们叫做实现类要么重写接口中所有的抽象方法要么实现类是一个抽象类。原创 2024-01-26 10:20:25 · 1019 阅读 · 0 评论 -
黑马程序员——javase进阶——day01——匿名对象 , 继承 , 抽象类
修饰符类名(参数){...}没有返回值,连void都没有方法名与类名相同构造方法可以进行重载定义没有变量接收的对象,称作为匿名对象。原创 2024-01-24 18:32:38 · 1087 阅读 · 0 评论 -
黑马程序员——javase基础——day09——动漫美女拼图
来,继续啊,为了讲解项目动漫拼图,这里我们先讲解一个小知识:继承概述。通过这个名字呢,大家也发现了,这里我们仅仅是对继承做一个简单的讲解,后续呢,会深入的给大家再来讲解继承相关的知识。首先,我们来说一下,什么是继承是面向对象三大特征之一(封装,继承和多态)可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法也就是说,通过继承,可以把父类中能够被访问到的成员变量和成员方法拿过来直接使用。了解了什么是继承后,我们在来说一下,继承是如何实现的。那继承是如何实现的呢?原创 2024-01-19 10:53:44 · 1453 阅读 · 0 评论 -
黑马程序员——javase基础——day08——数组
来,继续啊,下面我们来学习数组。那什么是数组呢?为了帮助大家理解,这里我们来看这样的一个场景:看这里,有一个学员的考试成绩,为了存储这个学员的考试成绩,我们可以采用一个变量进行存储。但是,假如这里有很多个学员的考试成绩,我们要存储该怎么办呢?估计有同学就想到了,采用多个变量存储不就行了吗。对,想的没错。确实可以采用多个变量进行存储,只不过将来要对这多个变量进行操作就比较麻烦了,比如说:找到成绩最高的学员。按照我们学过的获取两个数的较大值,需要编写大量的判断逻辑才能完成这个操作。原创 2024-01-19 09:36:06 · 1175 阅读 · 0 评论 -
黑马程序员——javase基础——day07——常用API(2)
因为,在输入框里输入的数据,我们得到的是一个字符串数据,而实际比较的时候我们需要的是一个int类型的数据,所以,我们得想办法把字符串数据转换为int类型的数据。所以,我们说,将基本数据类型封装成对象的好处就是可以通过对象调用方法操作数据。来,我们一起看一下,在这个输入框里,我们要输入一个猜的数据,然后点击我猜这个按钮,和已经产生的数据进行比对,给出相应的提示即可。当然,这里也有两个比较特殊的,一个是int类型的包装类,一个是字符类型的包装类,它们的包装类名称是这个样子的,大家了解一下即可。原创 2024-01-18 09:46:57 · 993 阅读 · 0 评论 -
黑马程序员——javase基础——day06——常用API(1)
来,继续啊,我们在讲解面向对象的时候,提到了学习面向对象重点就是学习两块内容:第一块:学习如何自己设计对象并使用第二块:学习获取已有对象并使用而关于第一块知识:学习如何自己设计对象并使用,我们现在已经有一些基础了。通过前面的学习呢,我们知道了如何定义类,并通过构造方法创建对象,然后通过对象使用成员变量和成员方法。接下来,我们要学习的是第二块知识:获取已有对象并使用。而获取已有对象并使用呢,在Java中我们习惯称之为常用API的学习。所以下面我们来学习常用API。:应用程序编程接口。原创 2024-01-18 09:16:29 · 1577 阅读 · 0 评论 -
黑马程序员——javase基础——day05——面向对象基础
类是对现实生活中一类具有共同属性和行为的事物的抽象我们可以将其理解为对象的设计图是能够看得到摸的着的真实存在的实体小结类是对象的抽象,对象是类的实体类是什么:是对现实生活中一类具有共同属性和行为的事物的抽象,确定对象将会拥有的属性和行为类的组成:属性和行为属性:在类中通过成员变量来体现(类中方法外的变量)行为:在类中通过成员方法来体现(和前面的方法相比去掉static关键字即可)需求:定义一个学生类,然后定义一个学生测试类,在学生测试类中通过对象完成成员变量和成员方法的使用。原创 2024-01-18 08:38:01 · 946 阅读 · 0 评论 -
黑马程序员——javase基础——day04——方法
来,继续啊,下面我们来学习Java中很重要的一个知识,就是方法,那什么是方法呢?就是完成特定功能的代码块如何理解这句话呢?来,我们看一段代码,相信这个大家应该已经很熟悉了这就是我们的main方法,也就是我们说的主方法。它里面的代码的功能:是在控制台输出一个字符串数据:HelloWorld我们再来看另一段代码:这里出现了三个方法,主方法的作用,还是在控制台输出一个字符串数据:HelloWorld。而后面这两个方法的作用:分别是在控制台输出字符串数据:method1和method2。原创 2024-01-17 10:28:03 · 1115 阅读 · 0 评论 -
黑马程序员——javase基础——day03——循环语句
这三种循环可以做相同的事情,当然它们也有小的区别,至于它们的应用及区别,我们后面会详细讲解。这里我们来学习for循环。由于循环语句的区别,只是大家需要理解的知识点,故这里不需要练习,我们在后面的使用中,在慢慢体会即可。需求:小芳的妈妈每天给她2.5元钱,她都会存起来,但是,每当这一天是存钱的第5天或者5的倍数的话,还提到了这里的几个部分,分别是定义变量,条件判断,控制变量的变化,展示手机信息(可能被多次执行)代码演示后,通过Debug查看了一下程序的执行流程,让我们更清晰do-while循环的执行流程。原创 2024-01-17 08:46:07 · 1084 阅读 · 0 评论 -
黑马程序员——javase基础——day02——运算符&选择语句
很明显,这是不合理的,因为我们把三种状态都设置为true了,而实际生活中,只会有一种状态为true,怎么解决呢多种情况的判断呢?在switch语句中,如果case控制的语句体后面不写break,将出现穿透现象,在不判断下一个case值的情况下,向下运行,直到遇到break,或者整个switch语句结束。这样就太麻烦了,那么,有没有一种流程语句,能够简化这种操作呢?了解了交通信号灯的基本逻辑后,下面呢,我们通过if语句来实现过马路的信号灯判断,而if语句呢,有三种格式,这里我们首先来学习第一种格式。原创 2024-01-16 19:59:30 · 1061 阅读 · 0 评论 -
黑马程序员——javase基础——day01——Java入门&IDEA&基础语法
下面我们正式进入Java的学习,在这里,大家第一个关心的问题,应该就是Java是什么,我们一起来看一下:Java是什么:Java是一门非常优秀的计算机语言语言:人与人交流沟通的表达方式计算机语言:人与计算机之间进行信息交流沟通的一种特殊语言Java之父:詹姆斯·高斯林(James Gosling)知道了Java是什么之后,大家就会想,我们学完Java可以做什么呢?下面,我们就来聊一聊,Java的三大技术平台:JavaSEJavaMEJavaEE。原创 2024-01-16 11:17:59 · 1681 阅读 · 0 评论 -
包装类详解(装箱,拆箱)
实际上也确实如此,为了解决这个问题,java 引入了一类特殊的类,即这 8 种基本数据类型的包装类,在使用过程中,会将类似 int 这样的值包装到一个对象中去。Object 引用可以指向任意类型的对象,但有例外出现了,8 种基本数据类型不是对象,那岂不是刚才的泛型机制要失效了?可以看到在使用过程中,装箱和拆箱带来不少的代码量,所以为了减少开发者的负担,java 提供了自动机制。基本就是类型的首字母大写,除了 Integer 和 Character。注意:自动装箱和自动拆箱是工作在。原创 2023-03-04 23:04:26 · 291 阅读 · 0 评论 -
泛型详解.
那么,要解决上述问题,我们很自然的想到一个解决办法,将我们的顺序表的元素类型定义成 Object 类型,这样我们的 Object 类型的引用可以指向 Person 类型的对象或者指向 Book 类型的对象了。问题:我们之前实现过的顺序表,只能保存 int 类型的元素,如果现在需要保存 指向 Person 类型对象的引用的顺序表,请问应该如何解决?通过以上代码,我们可以看到泛型类的一个使用方式:只需要在所有类型后边跟尖括号,并且尖括号内是真正的类型,即 E 可以看作的最后的类型。原创 2023-03-04 22:28:31 · 349 阅读 · 0 评论 -
java封装继承多态详解
类就是封装数据和操作这些数据代码的逻辑实体。在一个类的内部,某些属性和方法是私有的,不能被外界所访问。通过这种方式,对象对内部数据进行了不同级别的访问控制(public,protected,private),就避免了程序中的无关部分的意外改变或错误改变了对象的私有部分。提高了代码的复用,继承有这样一种能力,就是使用现有的类的所有功能,还可以在父类的基础上进行扩展功能(重写或者实现新的方法)。实现继承可以直接使用基类的属性和方法而无需额外编码,接口继承是指使用属性和方法的名称,但是基类必须提供实现的能力。原创 2023-03-04 20:44:03 · 956 阅读 · 0 评论 -
传输层重点协议
加快发送的速度.同时密切监测丢包情况.如果加到一定程度了,发生丢包,意思就是网络链路已经顶不住~~立即再减小窗口大小让速度再慢下来如果不丢包了,再逐渐加码~~~反复重复上述过程,拥塞窗口就会逐渐稳定到某个合适的值上~~如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送,就会造成丢包,继而引起丢包重传等等一系列连锁反应。人如其名,要对数据的传输进行一个详细的控制。所谓的粘包问题,指的是,当有多个TCP数据包到达的时候,如果不显式的约定包和包之间的边界,就很容易对数据产生混淆。原创 2023-02-27 20:41:22 · 367 阅读 · 0 评论 -
TCP流套接字编程
Socket 是客户端Socket,或服务端中接收到客户端建立连接(accept方法)的请求后,返回的服务端Socket。不管是客户端还是服务端Socket,都是双方建立连接以后,保存的对端信息,及用来与对方收发数据的.以上客户端与服务端建立的为短连接,每次客户端发送了TCP报文,及服务端接收了TCP报文后,双方都会关闭连接。长连接:不关闭连接,一直保持连接状态,双方不停的收发数据,即是长连接。一次阻塞等待对应着一次请求、响应,不停处理也就是长连接的特性:一直不关闭连接,不停的处理请求。原创 2023-02-19 20:58:28 · 494 阅读 · 0 评论 -
UDP数据报套接字编程
2. 如果NM,则接收的byte[]字节数组中会有很多初始化byte[]的初始值0,转换为字符串就是空白。以下是对应请求和响应的改造:构造一个展示服务端本地某个目录(BASE_PATH)的下一级子文件列表的服务.要解决以上问题,就需要发送端和接收端双方约定好一致的协议,如规定好结束的标识或整个数据的长度。DatagramSocket 是UDP Socket,用于发送和接收UDP数据报。原创 2023-02-18 17:48:12 · 711 阅读 · 1 评论 -
Socket套接字
对于数据报来说,可以简单的理解为,传输数据是一块一块的,发送一块数据假如100个字节,必须一次发送,接收也必须一次接收100个字节,而不能分100次,每次接收1个字节。对于字节流来说,可以简单的理解为,传输数据是基于IO流,流式数据的特征就是在IO流没有关闭的情况下,是无边界的数据,可以多次发送,也可以分开多次接收。对于UDP协议来说,具有无连接,面向数据报的特征,即每次都是没有建立连接,并且一次发送全部数据报,一次接收全部的数据报。原始套接字用于自定义传输层协议,用于读写内核没有处理的IP协议数据。原创 2023-02-18 15:48:33 · 660 阅读 · 0 评论 -
网络编程基础
所以即便是同一个主机,只要是不同进程,基于网络来传输数据,也属于网络编程。特殊的,对于开发来说,在条件有限的情况下,一般也都是在一个主机中运行多个进程来完成网络编程。用户在浏览器中,打开在线视频网站,如抖音看视频,实质是通过网络,获取到网络上的一个视频资源。网络编程,指网络上的主机,通过不同的进程,以编程的方式实现网络通信(或称为网络数据传输)。服务端:在常见的网络数据传输场景下,把提供服务的一方进程,称为服务端,可以提供对外服务。注意:发送端和接收端只是相对的,只是一次网络数据传输产生数据流向后的概念。原创 2023-02-18 09:36:29 · 373 阅读 · 0 评论 -
JavaSE 文件内容的读写
InputStream 只是一个抽象类,要使用还需要具体的实现类。上述,我们其实已经完成输出工作,但总是有所不方便,我们接来下将 OutputStream 处理下,使用PrintWriter 类来完成输出,因为PrintWriter 类中提供了我们熟悉的 print/println/printf 方法。上述例子中,我们看到了对字符类型直接使用 InputStream 进行读取是非常麻烦且困难的,所以,我们使用一种我们之前比较熟悉的类来完成该工作,就是 Scanner 类。将文件完全读完的两种方式。原创 2023-02-17 19:57:45 · 411 阅读 · 0 评论 -
JavaSE 文件操作
Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述。注意,有 File 对象,并不。mkdir() 的时候,如果中间目录不存在,则无法创建成功;mkdirs() 可以解决这个问题。观察 deleteOnExit 的现象。程序运行结束后,文件还是被删除了。代表真实存在该文件。普通文件的创建、删除。原创 2023-02-17 14:21:47 · 139 阅读 · 0 评论 -
网络通信编程基础
注意我们这里说的是传统意义上的交换机和路由器,也称为二层交换机(工作在TCP/IP五层模型的下两层)、三层路由器(工作在TCP/IP五层模型的下三层)。协议,网络协议的简称,网络协议是网络通信(即网络数据传输)经过的所有网络设备都必须共同遵从的一组约定、规则。有了IP地址和端口号,可以定位到网络中唯一的一个进程,但还存在一个问题,网络通信是基于二进制0/1数据来传输,如何告诉对方发送的数据是什么样的呢?端口号是0~65535范围的数字,在网络通信中,进程可以通过绑定一个端口号,来发送及接收网络数据。原创 2023-02-15 10:42:11 · 487 阅读 · 0 评论 -
多线程之死锁,哲学家就餐问题的实现
最常用的一种死锁阻止技术就是锁排序. 假设有 N 个线程尝试获取 M 把锁, 就可以针对 M 把锁进行编号(1, 2, 3...M).N 个线程尝试获取锁的时候, 都按照固定的按编号由小到大顺序来获取锁. 这样就可以避免环路等待.当然,死锁的情况下如果打破上述任何一个条件,便可让死锁消失。死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。更实用的方法,就是尽量避免锁嵌套.(不要在一个加锁的代码中,再去加其他锁...)属于理论上的破除死锁的方法.但是这样的方法,并不实用.原创 2023-02-14 16:05:32 · 903 阅读 · 0 评论 -
线程安全的集合类
Hashtable: 线程安全. 使用 synchronized 锁 Hashtable 对象, 效率较低. key 不允许为 null.这个是 Java1.7 中采取的技术. Java1.8 中已经不再使用了. 简单的说就是把若干个哈希桶分成一个。目的也是为了降低锁竞争的概率. 当两个线程访问的数据恰好在同一个段上的时候, 才触发锁竞争.读操作没有加锁. 目的是为了进一步降低锁冲突的概率. 为了保证读到刚修改的数据, 搭配了。在读多写少的场景下, 性能很高, 不需要加锁竞争.8 个元素)就转换成红黑树.原创 2023-02-14 13:20:13 · 298 阅读 · 0 评论 -
JUC(java.util.concurrent) 的常见类
线程池就是为了解决这个问题. 如果某个线程不再使用了, 并不是真正把线程释放, 而是放到一个 "池子"中, 下次如果需要用到线程就直接从池子中取, 不必通过系统来创建了。加锁, V 操作作为解锁, 前三个线程的 P 操作都能顺利返回, 后续线程再进行 P 操作就会阻塞等待,当有车开进去的时候, 就相当于申请一个可用资源, 可用车位就 -1 (这个称为信号量的 P 操作)ReentrantLock提供了更丰富的功能!如果计数器的值已经为 0 了, 还尝试申请资源, 就会阻塞等待, 直到有其他线程释放资源.原创 2023-02-12 15:39:22 · 462 阅读 · 0 评论 -
Callable 接口
Callable 是一个 interface . 相当于把线程封装了一个 "返回值". 方便程序猿借助多线程的方式计算结果.结果.Callable 和 Runnable 相对, 都是描述一个 "任务". Callable 描述的是带有返回值的任务,Callable 和 Runnable 相对, 都是描述一个 "任务". Callable 描述的是带有返回值的任务,Callable 是一个 interface . 相当于把线程封装了一个 "返回值". 方便程序猿借助多线程的方式计算。原创 2023-02-12 11:58:12 · 434 阅读 · 0 评论 -
Synchronized 原理
偏向锁不是真的 "加锁", 只是给对象头中做一个 "偏向锁的标记", 记录这个锁属于哪个线程.当前申请锁的线程是不是之前记录的线程), 那就取消原来的偏向锁状态, 进入一般的轻量级锁状态.偏向锁不是真的加锁, 而只是在锁的对象头中记录一个标记(记录该锁所属的线程). 如果没有其他线。随着其他线程进入竞争, 偏向锁状态被消除, 进入轻量级锁状态(自适应的自旋锁).实际开发过程中, 使用细粒度锁, 是期望释放锁的时候其他线程能使用锁.如果竞争进一步激烈, 自旋不能快速获取到锁状态, 就会膨胀为重量级锁。原创 2023-02-12 11:17:10 · 1973 阅读 · 0 评论 -
CAS详解.
(3) 线程2 再执行 CAS 操作, 第一次 CAS 的时候发现 oldValue 和 value 不相等, 不能进行赋值. 因此需要进入循环.在循环里重新读取 value 的值赋给 oldValue。假设存在两个线程 t1 和 t2. 有一个共享变量 num, 初始值为 A.接下来, 线程 t1 想使用 CAS 把 num 值改成 Z, 那么就需要。操作.我们期望一个线程执行 -50 成功, 另一个线程 -50 失败.如果使用 CAS 的方式来完成这个扣款过程就可能出现问题.都版本不一样了咋办?原创 2023-02-11 22:03:46 · 2270 阅读 · 2 评论