- 博客(24)
- 资源 (2)
- 收藏
- 关注

原创 ASM的基本使用
ASM是什么:ASM是一个通用的Java字节码操作和分析框架。 它可以用于修改现有类或直接以二进制形式动态生成类。 ASM提供了一些常见的字节码转换和分析算法,可以从中构建自定义复杂转换和代码分析工具。 ASM提供与其他Java字节码框架类似的功能,但专注于性能。 因为它的设计和实现尽可能小而且快,所以它非常适合在动态系统中使用(但当然也可以以静态方式使用,例如在编译器中)。1、如何用ASM读出整个类:利用ASM的ClassReader将class文件或Stream流读进ClassReader.
2020-10-25 15:59:25
2334
1
原创 多线程与高并发(九):线程池
1、简介1.1、 线程池的概念:线程池是线程的集合,它会初始化一些线程,当有任务提交给线程池时,线程池会分配空闲的线程去执行任务,执行结束之后,线程会再次成为空闲状态,等待执行下一个任务。1.2、 线程池的优点:线程池可以重用已存在的线程,降低操作系统重复创建和销毁线程的资源消耗。线程池可以提前创建好线程,当任务到达时,无需等待创建新的线程便可立即执行,提高系统响应速度。可以通过线程池对系统并发量进行控制,线程若是无限制地创建,可能会导致内存占用过多而产生OOM,并且会造成cpu过度切换。提
2021-03-02 22:44:14
273
原创 多线程与高并发(八):Callable
在Java中,创建线程除了继承Thread类和实现Runnable接口之外,还可以通过实现Callable接口创建线程。一、如何通过实现Callable接口创建线程public class MyThread implements Callable<Object> { @Override public Object call() throws Exception { return "this is my thread"; }}二、Cal.
2021-03-02 00:19:54
305
2
原创 多线程与高并发(五):AQS
一、简介1、什么是AQSAQS全名AbstractQueuedSynchronizer,抽象的队列式的同步器,它定义了一套多线程访问共享资源的同步器框架,许多同步类都依赖于它,如ReentrantLock、CountDownLatch、Semaphore等2、AQS的结构AQS主要为一个volatile的state和一个CLH队列组成。二、AQS原理1、stateAQS主要通过state去控制线程对共享资源的访问,此处的state用volatile修饰,主要原因为让stat.
2021-02-27 01:29:19
233
原创 多线程与高并发(四):JUC中的多线程辅助类
一、CountDownLatchCountDownLatch是门栓的意思,在计数器减为0前二、CyclicBarrier三、Phaser四、Semaphore五、Exchanger六、LockSupport七、ThreadLocal
2021-02-24 17:23:12
176
4
原创 多线程与高并发(三):JUC中常用的锁
一、常用的锁1、ReentrantLockReentrantLock是Lock的一个实现类,它的底层基于CAS实现,是一种可重入互斥锁,用于替代synchronized,但功能比synchronized更强大。ReentrantLock的使用:private final ReentrantLock lock = new ReentrantLock();public void m() { try { lock.lock(); // ... method body } fina
2021-02-23 00:06:41
299
1
原创 多线程与高并发(二):synchronized、volatile和CAS
一、synchronized1、一些基本概念1、synchronized可以在任意对象和方法上加锁,加锁的这段代码称为“互斥区”或“临界区”。当一个线程想要执行同步方法里面的代码时,会首先尝试拿到这把锁,如果拿到则能执行,如果不能拿到,则会不断去拿这把锁,直到拿到为止。2、如果多个线程同时对同一个对象中的同一个实例变量进行操作时,可能会出现值被更改、值不同步的情况,进而影响程序的执行流程,这也叫做非线程安全。3、synchronized既能保证了原子性,又能保证可见性。4、synchro
2021-02-19 17:19:33
363
1
原创 多线程与高并发(一):线程的基本概念
一、进程和线程进程:进程是系统进行资源分配和调度的基本单位。例如电脑运行的QQ就是一个进程。线程:线程是进程中独立运行的子任务,是操作系统能够进行运算调度的最小单位。例如QQ中监听是否收到新消息就是一个线程做的。二、创建线程的几种方式1、继承Thread类2、实现Runnable接口3、实现Callable接口三、JAVA中线程的一些方法:1、start2、run3、sleep4、yield5、join6、wait7、notify、notifyAll
2021-02-18 22:20:14
147
原创 springboot启动源码解析(四):初始化默认应用参数、准备启动环境
此章节主要对springboot启动过程中,发生的【初始化应用参数】、【准备启动环境】、【配置需要忽略的Bean】、【打印Banner】进行源码解析,对应的代码如图1所示:图1:// 初始化应用参数ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);// 准备启动环境ConfigurableEnvironment environment = prepareEnvironment(l
2021-02-17 02:18:57
3094
2
原创 springboot启动源码解析(三):初始化启动上下文、初始化监听器列表、发布开始启动事件
此章节主要对springboot启动过程中,发生的【初始化启动上下文】、【初始化监听器列表】、【发布springboot开始启动事件】进行源码解析,对应的代码如下所示:// 首先初始化一个计时器,并开始了启动计时StopWatch stopWatch = new StopWatch();stopWatch.start();// 初始化启动上下文DefaultBootstrapContext bootstrapContext = createBootstrapContext();Configu
2021-02-15 23:02:12
5931
9
原创 图解BIO、NIO和AIO
传统BIO特点:如图所示,在BIO模型中, 会有一个专门的acceptor线程负责监听内核中是否存在客户端的连接,若有新的客户端连接请求时,就新启一个线程对它进行处理,有多少个客户端就对应多少个线程。在客户端连接的整个周期内,都会有一个专门的线程负责对它进行读写。缺点:accept、write、read均是用户态行为的,它们在监听、读写的过程中都会涉及到用户态与内核态线程的切换,十分消耗资源。accept、write、read均是同步阻塞的,假如客户端连接上以后,一直不发送数据.
2021-02-02 22:25:55
410
原创 springboot启动源码解析(二):启动的整体流程解析
springboot启动的整体流程解析在SpringApplication初始化(详见:springboot启动源码解析(一):SpringApplication初始化)之后,开始了真正意义上的启动过程,通过调用SpringApplication实例的run()方法进行启动,下面从整体流程梳理整个启动过程。 public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args)
2021-02-01 21:56:25
481
原创 springboot启动源码解析(一):SpringApplication初始化
初始化SpringApplicationSpringBoot通过执行@SpringBootApplication标记类的main函数中的SpringApplication.run(SpringBootTestApplication.class, args)进行启动@SpringBootApplicationpublic class SpringBootTestApplication { public static void main(String[] args) { ...
2021-01-30 17:47:40
1363
2
原创 springboot如何配置接口驼峰转下划线以及时间格式等
@Configurationpublic class ObjectMapperConfig { @Bean public MappingJackson2HttpMessageConverter messageConverter() { ObjectMapper objectMapper = new ObjectMapper(); // 统一返回数据的输出风格 objectMapper.setPropertyNamingStrategy(n.
2021-01-10 21:13:46
958
原创 如何开启定时任务
@Configuration@EnableSchedulingpublic class scheduledConfigTest implements SchedulingConfigurer { @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { // expression 时间表达式 taskRegistrar.addCronTask(Runnable.
2021-01-08 09:16:49
451
原创 maven学习总结
仓库优先级:本地仓库->镜像仓库->默认中央仓库maven工程类型:pom工程:逻辑工程,用在父级工程或聚合工程中,用来做jar包的版本控制jar工程:将会打包程jar,用作jar包使用。war工程:将会打包成war,发布在服务器上的工程Maven工程GroupId:包名,一般域名反转ArtifactId:项目名,一般使用项目名字版本:SHAPSHOT(快照版,非正式版)项目间的关系依赖关系:A工程在开发或运行中需要B工程提供支持...
2021-01-07 21:09:17
176
原创 微服务--负载均衡--Ribbon
Ribbon的基本概念:Ribbon是Netflix开发的客户端负载均衡器,为Ribbon配置服务提供者地址列表后,Ribbon就可以基于某种负载均衡策略算法,自动地帮助服务消费者去请求服务提供者。Ribbon作为SpringCloud的负载均衡机制的实现:Ribbon可以单独使用。作为一个独立的负载均衡组件,需要手动配置服务地址列表。 Ribbon与Eureka配合使用时,Ribbon可自动从EurekaServer获取服务提供者地址列表(DiscoveryClient),并基于负载均衡算法
2020-11-06 18:00:28
434
1
原创 微服务--服务注册中心--Eureka
服务端:1、增加pom依赖:<groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>2、配置application:eureka: instance: hostname: enreka-7000 client:# register-with-eurek
2020-11-02 23:04:43
446
原创 设计模式:(一)单例模式
①懒汉式单例该模式的特点是类加载时没有生成单例,只有当第一次调用 getlnstance 方法时才去创建这个单例。public class LazySingleton{ private static volatile LazySingleton instance=null; //保证 instance 在所有线程中同步 private LazySingleton(){} //private 避免类在外部被实例化 public static LazySingleto...
2020-10-13 17:00:58
146
原创 如何用mybatis进行foreach
1.在数据库url连接后加入allowMultiQueries=true参数。2.DAO层:Integer updateDepartmentIdByEmails(@Param("emails") List<String> emails, @Param("departmentId") Integer departmentId);3.Mapper:<update i...
2019-07-30 20:44:43
191
原创 动态规划(1)——零钱凑整
假设有几种硬币、{1,x1,x2……},数量无限。求出能够凑成某个数目所使用的最少的硬币数。解:设置一个数组minCoins[],minCoins[i]表示,凑成i元所需要的最少硬币数。假设要凑成N元,而且最后一个硬币用的是Xn面值的,那么所需要的最少硬币数则为{minCoins[N-Xn]+1}枚。由此可见,凑成N元所需要的最少硬币数为循环查找最后一枚所使用硬币面值所得到的最少硬
2017-09-23 12:15:55
2166
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人