- 博客(281)
- 收藏
- 关注
原创 《他强由他强,清风拂山岗;他横由他横,明月照大江》之四
当发生 GC 时,用户线程必须全部停下来,才可以进行垃圾回收,这个状态我们可以认为 JVM 是安全的(safe),整个堆的状态是稳定的。对停顿时间敏感的应用:G1设计目标是为了提供可预测的停顿时间,通过允许用户设定期望的停顿时间(比如50毫秒),G1能够通过控制每次垃圾收集的工作量来满足这个目标。这个机制确保了在进行这些操作时,没有正在执行的线程会更改JVM的内存状态,这对于垃圾回收器正确识别可达对象、重新编译方法或执行其他需要全局视角的操作是十分重要的。函数式接口是只定义了一个抽象方法的接口。
2024-06-20 15:00:04
992
原创 《他强由他强,清风拂山岗;他横由他横,明月照大江》之三
由于OSGi环境中对类的加载以及模块间的依赖关系有严格的控制,所以OSGi也自定义了类加载器的行为,实现类加载时可能不遵循传统的双亲委派模型。这样的设计将对象的创建与其使用的控制分离开来,工厂模式隐藏了对象创建的细节,而代理模式控制了对象的访问,并可以在对象方法的执行前后添加额外逻辑。构造函数中不仅包括开发者定义的初始化代码,还包括编译器可能提供或者插入在构造函数中的特殊代码,用来初始化方法区中的数据。设置对象头:JVM需要在对象头中设置一些数据,如对象是哪个类的实例、对象的哈希码、对象的GC代年龄等。
2024-05-11 17:24:44
711
原创 《他强由他强,清风拂山岗;他横由他横,明月照大江》之二
使用 ArrayList 更适合查找和更新操作频繁的场景,因为它提供了快速的随机访问能力,两者都是线程不安全的。LinkedList 更适用于插入和删除操作频繁的场景,尤其当这些操作发生在列表的头部或者中间位置时。在决定使用 ArrayList 还是 LinkedList 时,要考虑应用的具体需求,包括操作类型(插入、删除、访问),操作的位置(头部、中间、尾部)以及性能要求。
2024-04-12 14:13:55
1058
原创 《他强由他强,清风拂山岗;他横由他横,明月照大江》之一
TCP提供可靠的、面向连接的传输服务,适合于那些需要确保数据完整性和顺序性的应用。它通过一系列复杂的协议机制(如错误检测、确认重传、流量控制和拥塞控制)来保证这一点。UDP则提供简单的、不可靠的、无连接的数据传输服务,适合于那些对实时性要求高、对数据丢失不敏感的应用。UDP由于其低延迟和较小的协议开销,常用于那些对网络质量要求不太高的场景。选择TCP或UDP通常取决于应用程序对数据传输的具体需求。一些应用可能还会结合使用TCP和UDP来利用各自的优势。
2024-03-22 10:23:53
676
原创 HBase基础入门|原理
HBase是一个面向海量数据场景,分布式的、多版本、面向列的开源KV数据库。运行在HDFS的基础上,支持PB级别、百万列的数据存储。
2022-09-26 23:45:00
1337
1
转载 Kafka 容错及高可用原理 | 运维进阶
在kafka中以分区作为复制单元。每个topic由一个或多个分区组成,每个分区都包含一个leader副本及0个或多个follower副本。当你在创建topic时,需要指定分区数及复制因子。通常情况下一个复制因子是3的topic表明它有一个leader副本及两个follower副本。不论是一个leader副本还是一个follower副本都会被算作一个数据副本。1个topic的4个分区分布在3个broker上一个独立的 Kafka 服务器就被称为 broker,broker 接收来自生产者的消息,为消息设置偏移
2022-09-26 11:32:14
1135
1
原创 MySQL之索引详解
索引的涉及原则索引的设计可以遵循一些已有的原则,创建索引的时候请尽量考虑符合这些原则,便于 提升索引的使用效率,更高效地使用索引。搜索的索引列,不一定是所要选择的列。换句话说,最适合索引的列是出现在 WHERE 子句中的列,或连接子句中指定的列,而不是出现在 SELECT 关键字后的选择列表中的列。 使用区分度高的字段当做索引,例如性别、状态等字段就不适合添加索引。使用短索引。如果对字符串列进行索引,应该指定一个前缀长度,只要有可能就应 该这样做。例如,如果有一个 name CHAR(200)列
2021-09-05 22:19:04
487
原创 MySQL之SQL语句执行过程
我们可能每天都或多或少的写一些SQL语句,但是你有没有思考过MySQL接收到SQL的执行命令之后底层是如何执行的呢,从这篇文章开始我们开始揭开MySQL底层执行过程的面纱。首选创建表create table user_info ( id int not null primary key, username varchar(16) not null, city varchar(16) not null, salary int not null default 0, createti
2021-08-23 22:48:02
1934
转载 数据库连接池性能比对(hikari druid c3p0 dbcp jdbc)
背景对现有的数据库连接池做调研对比,综合性能,可靠性,稳定性,扩展性等因素选出推荐出最优的数据库连接池。 NOTE: 本文所有测试均是MySQL库测试结论 1:性能方面hikariCP>druid>tomcat-jdbc>dbcp>c3p0 。hikariCP的高性能得益于最大限度的避免锁竞争。 2:druid功能最为全面,sql拦截...
2019-07-11 00:30:10
2237
原创 SpringBoot学习笔记四之【自动配置原理与举例】
版本2.1.1springboot只有一个application的启动,我们就从这个启动开始分析,首先我们跟进注解@SpringBootApplication如下:/** Class, interface (including annotation type), or enum declaration */@Target(ElementType.TYPE)@Retention(Ret...
2019-01-26 23:42:14
1519
原创 SpringBoot学习笔记三之【多Profile文件的Maven发布使用】
在springboot工程中配置文件编写的时候可以使用application-{profile}.properties/yml,默认使用application.properties/yml,例如:每个环境配置如下:#application-dev.propertiesserver.port=8080#application-test.propertiesserver.port=...
2019-01-24 23:42:53
1456
1
原创 SpringBoot学习笔记二之【yml配置举例与语法介绍】
Resource目录结构说明:static:保存所有的静态资源; js css images;templates:保存所有的模板页面;(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页面);可以使用模板引擎(freemarker、thymeleaf、velocity);application.properties(application.y...
2019-01-06 21:53:30
3603
3
原创 SpringBoot学习笔记一之【Idea下创建springboot示例、启动原理分析与两种部署启动方式】
1、使用背景首先说下我们为什么使用springboot,原因有以下几点1、快速创建独立运行的spring项目以及与主流框架继承2、使用嵌入式的Servlet容器,无需打成war包3、starters自动依赖于版本控制4、大量的自动配置,简化开发,也可修改默认值5、无需配置xml,无代码生成,开箱即用6、生产环境的运行时应用监控,配合springcloud全家桶7、与...
2019-01-06 00:44:32
1903
原创 RocketMQ学习笔记四之【DefaultMQPullConsumer使用与流程简单分析】
我们首先看下DefaultMQPullConsumer使用例子:package com.swk.springboot.rocketmq;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Set;import org.apache.rocketmq.client...
2019-01-05 21:59:55
6247
6
原创 RocketMQ学习笔记三之【DefaultMQPushConsumer流量控制】
上一节我们已经把DefaultMQPushConsumer的大体流程分析了一下,从这节开始我们分析一部分消息处理的细节问题。继续在DefaultMQPushConsumerImpl的pullMessage方法中有个ProcessQueue,待会我们来分析这个队列的作用。 public void pullMessage(final PullRequest pullRequest) { ...
2018-12-24 23:02:45
4271
1
原创 RocketMQ学习笔记二之【DefaultMQPushConsumer使用与流程原理分析】
版本: <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-client</artifactId> <version>4.3.0</v...
2018-12-23 00:29:44
17496
1
原创 RocketMq学习笔记之一【常用操作命令与简单配置】
【为什么使用RocketMq】1、应用解耦2、流量削峰3、消息分发4、保证最终一致性5、方便动态扩容【RocketMq的角色】producerconsumerBrokerNameServerbroker配置文件:#nameServer 地址,分号分割namesrvAddr=192.168.100.131:9876;192.168.100.132:...
2018-12-18 23:23:57
1683
原创 多线程复习笔记之四【多线程中的异常】
在一个线程组中如果其中一个线程执行报错并不影响其他线程的继续执行,例如:package com.fyw.thread.lock.exception;public class MyThread extends Thread { private String num; public MyThread(ThreadGroup group,String name,String num) ...
2018-12-16 23:54:17
1109
1
原创 多线程复习笔记之三【多线程中的Lock使用】
Lock1、getHoldCount()查询当前线程保持此锁锁定的个数,也就是调用lock方法的次数2、int getQueueLength返回正等待此锁定的线程估计数,例如有5个线程,1个线程首先执行await,那么调用getQueueLength返回43、int getWaitQueueLength(Condition condition)返回等待与次锁定相关的给定条件...
2018-12-16 23:00:59
1450
原创 多线程复习笔记之二【线程间的通信】
Object.wait:释放锁,当时代码不会往下继续执行,需要等待notify通知,wait(1000)超过1秒自动唤醒Object.notify:不释放锁,需要等到同步代码块执行完毕,如果没有wait线程,notify命令将被忽略。condition如果有多个线程处于等待状态,我想唤醒指定的一个线程,Object.notify是唤醒随机一个是无法实现的。condition实现过程如下...
2018-12-15 17:53:51
401
原创 多线程复习笔记之一【关键属性与常用关键字概述】
1、并发和并行的区别?并发可以发生在一个或多个CPU,同时处理多个任务,多个任务之间可以进行切换执行;并行只能发生在多核CPU,一核对应一个任务同时运行2、线程和进程之间的区别?a) 一个程序至少有一个进程,一个进程至少有个线程b) 进程在执行过程中拥有独立的内存单元,线程之间的内存却是共享的c) 线程不能独立运行,必须依赖进程举个例子:我们执行一个Main方法,里面其...
2018-12-15 17:47:40
460
转载 多线程设计模式:Master-Worker模式
Master-Worker是常用的并行计算模式。它的核心思想是系统由两类进程协作工作:Master进程和Worker进程。Master负责接收和分配任务,Worker负责处理子任务。当各个Worker子进程处理完成后,会将结果返回给Master,由Master作归纳总结。其好处就是能将一个大任务分解成若干个小任务,并行执行,从而提高系统的吞吐量。处理过程如下图所示:Master进程为主要进...
2018-11-21 22:31:19
1145
原创 java定时器之Timer使用与原理分析
Timer和TimerTaskTimer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次。TimerTask是一个实现了Runnable接口的抽象类,代表一个可以被Timer执行的任务。【使用举例】【schedule(TimerTask task, long delay) 延迟 delay 毫秒 执行】...
2018-11-07 16:10:15
20918
2
转载 synchronized的底层优化
Synchronized底层是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么Synchronized效率低的原因。因此,这种依赖于操作系统Mutex Lock所实现的锁我们称之为“重量级锁”。J...
2018-11-06 23:25:27
1103
转载 ReentrantLock原理
ReentrantLock主要利用CAS+AQS队列来实现。它支持公平锁和非公平锁,两者的实现类似。CAS:Compare and Swap,比较并交换。CAS有3个操作数:内存值V、预期值A、要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。该操作是一个原子操作,被广泛的应用在Java的底层实现中。在Java中,CAS主要是由sun.misc.Unsafe...
2018-11-04 20:18:23
74579
22
原创 线程间的通信wait与notify
wait()方法wait()方法使得当前线程必须要等待,等到另外一个线程调用notify()或者notifyAll()方法。当前的线程必须拥有当前对象的monitor,也即lock,就是锁。线程调用wait()方法,释放它对锁的拥有权,然后等待另外的线程来通知它(通知的方式是notify()或者notifyAll() 方法),这样它才能重新获得锁的拥有权和恢复执行。要确保调用wai...
2018-10-31 22:48:09
1180
转载 Java中的自旋锁
自旋锁(spinlock):是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。 获取锁的线程一直处于活跃状态,但是并没有执行任何有效的任务,使用这种锁会造成busy-waiting。Java如何实现自旋锁?下面是个简单的例子:public class SpinLock { priva...
2018-10-25 22:20:41
21855
7
原创 10、销售月饼的最大利润
题目描述月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有3种月饼,其库存量分别为18、15、10万吨,总售价分别为75、72、45亿元。如果市场的最大需求量只有20万吨,那么我们最大收益策略应该是卖...
2018-09-06 22:53:07
531
原创 9、数字黑洞
题目描述给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到 一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的6174,这个神奇的数字也叫Kaprekar常数。 例如,我们从6767开始,将得到 7766 - 6677 = 1089 9810 - 0189 = 9621 9621 -...
2018-08-28 22:16:06
1415
原创 8、锤子剪刀布
题目描述大家应该都会玩“锤子剪刀布”的游戏:现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。输入描述:输入第1行给出正整数N(<=105),即双方交锋的次数。随后N行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C代表“锤子”、J代表“剪刀”、B代表“布”,第1个字母代表甲方,第2个代表乙方,中间有1个空格。输...
2018-08-22 22:11:34
316
原创 7、A除以B
题目描述本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。输入描述:输入在1行中依次给出A和B,中间以1空格分隔。输出描述:在1行中依次输出Q和R,中间以1空格分隔。输入例子:123456789050987654321 7输出例子:1763668415014109...
2018-08-20 22:01:15
491
原创 6、部分A+B
题目描述正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA。例如:给定A = 3862767,DA = 6,则A的“6部分”PA是66,因为A中有2个6。 现给定A、DA、B、DB,请编写程序计算PA + PB。 输入描述:输入在一行中依次给出A、DA、B、DB,中间以空格分隔,其中0 < A, B < 1010。 输出描述:...
2018-08-19 18:02:33
287
原创 5、德才论
题目描述宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人。凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人。”现给出一批考生的德才分数,请根据司马光的理论给出录取排名。输入描述:输入第1行给出3个正整数,分别为:N(<=105),即考生总数;L(>=60),为录取最低分...
2018-08-19 12:36:17
386
原创 4、福尔摩斯的约会
题目描述大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大侦探很 快就明白了,字条上奇怪的乱码实际上就是约会的时间“星期四 14:04”,因为前面两字符串中第1对相同的大写英文字母(大小写有区分)是 第4个字母'D',代表星期四;第2对相同的字符是'E',那...
2018-08-18 17:10:45
393
原创 3、数素数
题目描述令Pi表示第i个素数。现任给两个正整数M <= N <= 10000,请输出PM到PN的所有素数。输入描述:输入在一行中给出M和N,其间以空格分隔。输出描述:输出从PM到PN的所有素数,每10个数字占1行,其间以空格分隔,但行末不得有多余空格。输入例子:5 27输出例子:11 13 17 19 23 29 31 37 41 ...
2018-08-18 17:07:38
486
原创 2、数字分类
题目描述 给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字: A1 = 能被5整除的数字中所有偶数的和; A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3-n4…; A3 = 被5除后余2的数字的个数; A4 = 被5除后余3的数字的平均数,精确到小数点后1位; A5 = 被5除后余4的数字中最大数字。输入描述: 每个输入包含1个测试用例。...
2018-08-18 17:05:09
401
原创 1、A+B和C
题目描述 给定区间[-2的31次方, 2的31次方]内的3个整数A、B和C,请判断A+B是否大于C。 输入描述: 输入第1行给出正整数T(&amp;lt;=10),是测试用例的个数。随后给出T组测试用例,每组占一行,顺序给出A、B和C。整数间以空格分隔。 输出描述: 对每组测试用例,在一行中输出“Case #X: true”如果A+B&amp;gt;C,否则输出“Case #X: false”,其中X是...
2018-08-18 16:59:41
378
原创 volatile的原理和使用场景
上下文切换 CPU为每个线程分配时间片(几十ms),CPU不断切换线程执行,切换的时候会记录状态,保证能够从原来的状态继续执行。当然上下文切换是有开销的,当线程执行时间非常短时我们用并发可能会耗时更久。使用【Lmbench3】和【vmstat】可以测量上下文切换的时间和次数。 为了降低开销我们应减少上下文切换,多线程竞争锁会引起上线文切换,CAS算法无需加锁,可以减少上线文切换,使用最少线程(...
2018-07-11 22:08:42
3260
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人