Java核心技术 - JUC
JUC包中锁原理剖析LockSupport工具类JDK中的 rt.jar包 里面的 LockSupport 是个工具类,它的主要作用是挂起和唤醒线程,该工具类是创建锁和其他同步类的基础。
LockSupport类与每个使用它的线程都会关联一个许可证,在默认情况下调用LockSupport类的方法的线程是不持有许可证的。LockSupport是使用Unsafe类实现的,下面介绍LockSupport中的几个主要函数。
1、void park()
如果调用 park 方法的线程已经拿到了与 LockSupport关联 的许可证,则调用 Locksupport.park() 时会马上返回,否则调用线程会被禁止参与线程的调度,也就是会被阻塞挂起。
如下代码直接在main函数里面调用park方法,最终只会输出begin park!,然后当前线程被挂起(阻塞),这是因为在默认情况下调用线程是不持有许可证的。
1234567public class Demo { public static void main(String[] args) { Sys ...
Java核心技术 - 多线程
线程种类
用户线程
守护线程
什么是线程操作系统在分配资源时是把资源分配给进程的,但是CPU资源比较特殊,它是被分配到线程的,因为真正要占用CPU运行的是线程,所以也说线程是CPU分配的基本单位。
在Java 中,当我们启动main函数时其实就启动了一个JVM的进程,而main 函数所在的线程就是这个进程中的一个线程,也称主线程。
进程和线程的关系如图1-1所示。
由图1-1可以看到,一个进程中有多个线程,多个线程共享进程的堆和方法区资源,但是每个线程有自己的程序计数器和栈区域。
程序计数器是一块内存区域,用来记录线程当前要执行的指令地址。那么为何要将程序计数器设计为线程私有的呢?前面说了线程是占用CPU执行的基本单位,而CPU一般是使用时间片轮转方式让线程轮询占用的,所以当前线程CPU时间片用完后,要让出CPU,等下次轮到自己的时候再执行。那么如何知道之前程序执行到哪里了呢?其实程序计数器就是为了记录该线程让出CPU时的执行地址的,待再次分配到时间片时线程就可以从自己私有的计数器指定地址继续执行。另外需要注意的是,如果执行的是native方法,那么pc计数器记录的是u ...
Java核心技术 - 基础
数值类型之间的转换
而比如doblue转int强制类型转换通过截断小数部分将浮点值转换为整型
自增与自减运算符
n++将变量n的当前值加 1, n--则将变量n 的值减一
前缀形式会先完成加 ;而后缀形式会先使用变量原来的值数据操作,最后才进行加减。
序列化我们使用序列化将对象集合保存到磁盘文件中,并按照它们被存储的样子获取它们。 序列化的另一种非常重要的应用是通过网络将对象集合传送到另一台计算机上。 正如在文件中保存原生的内存地址毫无意义一样,这些地址对于在不同的处理器之间的通信也是毫无意义的。 因为序列化用序列号代替了内存地址,所以它允许将对象集合从一台机器传送到另一台机器。
大数值使用 java.math 包中的两个很有用的类: Biglnteger BigDecimal 这两个类可以处理包含任意长度数字序列的数值。
Biglnteger 类实现了任意精度的整数运算, BigDecimal 实现了任意精度的浮点数运算。
数组12345String[] names = new String[10];会创建一个包含10个字符串的数组,所有字符串都为null。如果希望这个 ...
Docker学习
Docker安装123456789101112131415161718// 使用官方安装脚本自动安装curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun// 启动 Dockersudo systemctl start docker// 通过运行 hello-world 映像来验证是否正确安装了 Docker Engine-Community 。sudo docker run hello-world// 卸载旧版本sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ ...
RocketMQ学习
基本概念Producer Group标识发送同一类消息的Producer,通常发送逻辑一致。发送普通消息的时候,仅标识使用,并无特别用处。若事务消息,如果某条发送某条消息的producer-A宕机,使得事务消息一直处于PREPARED状态并超时,则broker会回查同一个group的其 他producer,确认这条消息应该commit还是rollback。
Consumer Group标识一类Consumer的集合名称,这类Consumer通常消费一类消息,且消费逻辑一致。同一个Consumer Group下的各个实例将共同消费topic的消息,起到负载均衡的作用。Consumer Group、topic 和 tag决定消费唯一Queue消息。
Topic标识一类消息的逻辑名字,消息的逻辑管理单位。无论消息生产还是消费,都需要指定Topic。消息主题,通过Topic对不同的业务消息进行分类。
Tag消息标签,用来进一步区分某个Topic下的消息分类,消息从生产者发出即带上的属性。
选择创建多个Topic,或者在同一个Topic下创建多个Tag。但通常情况下,不同的Topic之 ...
MySQL进阶学习
MySQL基础数据定义语言DDL(Data Definition Language)123456789101112131415161718对象: 数据库和表关键词: create alter drop truncate(删除当前表再新建一个一模一样的表结构)创建数据库:create database school;删除数据库:drop database school;切换数据库:use school;创建表:create table student id int(4) primary key auto_increment name varchar(20) score int(3) );查看数据库里存在的表:show tables;
数据操纵语言DML(Data Manipulation Language)1.插入 INSERT
1234567891011-- 单行插入INSERT INTO test(id, NAME) value(16, 'g');-- 插入且支持子查询INSERT INTO test(id, NAME) ...
MongoDB入门到进阶
安装MongoDB1. 下载:下载地址
2. 配置环境变量,注意到bin目录
3. 创建数据库所在目录,默认在C盘下的data文件夹中的db文件里
自定义数据库路径启动
1mongod --dbpath 数据库路径
自定义端口号启动
1mongod --port 端口号
自定义数据库路径 和 端口号 启动
1mongod --dbpath 数据库路径 --port 端口号
4. cmd输入 mongod 启动服务
5. 通过 localhost:27017 访问
6. cmd输入 mongo 启动客户端
7. 开机自启动mongod服务
在自定义的数据库路径data中新建log文件夹,然后在根目录新建mongod.cfg配置文件(mongodb4后,说是自带服务了,但是我是免安装版的,还是自己配置。)
配置文件内容如下:
123456<!--配置内容-->systemLog: destination: file path: mongod的目录\mongod.cfgstorage: dbPath: mongod的目录\bin
8. ...
Python从入门到进阶
认识Python推荐学习视频传送门:求知讲堂2020python+人工智能 99天完整版
第一个main函数12345def print_hi(name): print(f'Hi, {name}') # Press ⌘F8 to toggle the breakpoint.if __name__ == '__main__': print_hi('PyCharm')
输出打印ptint打印12345678910# format 格式化输出rs = 123print('rs={}'.format(rs))print('rs={0}'.format(rs))sum_func = lambda x,y,z,c: x*y*z*crs1 = sum_func(4,5,6,7)print('rs1 = %d'%rs1)print('rs1 = %d,study %s'%( ...
Spring基础
配置命名规范
多个单词分隔符用杠 -
RequestParam、PathVariable等注解区别@RequestParam 和 @PathVariable 注解是用于从request中接收请求的,两个都可以接收参数,关键点不同的是@RequestParam 是从request里面拿取值,而 @PathVariable 是从一个URI模板里面来填充
@RequestParamhttp://localhost:8080/user/getUser?postId=14523,根据上面的这个URL,会从request中获取 post_id 的值,然后赋值给别名 postId
123public User getUser(@RequestParam(value="post_id", required=false) String postId){...}
@RequestParam 支持下面四种参数:
defaultValue 如果本次请求没有携带这个参数,或者参数为空,那么就会启用默认值
name 绑定本次参数的名称,要跟URL上面的一样
re ...
Nacos服务
基本概念(1)Nacos 是阿里巴巴推出来的一个新开源项目,是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您 快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
(2)常见的注册中心:
Eureka(原生,2.0遇到性能瓶颈,停止维护)
Zookeeper(支持,专业的独立产品。例如:dubbo)
Consul(原生,GO语言开发)
Nacos
12345相对于 Spring Cloud Eureka 来说,Nacos 更强大。Nacos = Spring Cloud Eureka + Spring Cloud ConfigNacos 可以与 Spring, Spring Boot, Spring Cloud 集成,并能代替 Spring Cloud Eureka, Spring Cloud Conf ...