- 博客(95)
- 资源 (1)
- 收藏
- 关注

原创 读懂HashMap源码
1 HashMap源码(jdk7)详见:HashMap类主要由一个Entry数组Entry<K,V>[] table构成2 HashMap源码(jdk8)HashMap类主要由一个Node数组Node<K,V>[] table`构成;put操作时,如哈希碰撞,元素插入链表是从尾部插入(jdk7是从头部插入)put操作时,如第一次put,即table为空时,则先调用resize,然后put,非第一次,即table.length > 0时,则先put,再resiz
2020-07-11 01:23:23
341

原创 Linux下编译OpenJDK源码以及在Eclipse中调试Hotspot虚拟机
Linux下编译OpenJDK源码以及在Eclipse中调试Hotspot虚拟机
2017-11-09 22:48:04
4873
1
原创 ShardingSphere学习手册
https://shardingsphere.apache.org/document/legacy/4.x/document/cn/overview/概念&功能.1 数据分片.1.1 核心概念SQL逻辑表Logic Table真实表Actual Table数据节点Data Node绑定表Binding Table 指分片规则一致的主表和子表。绑定表之间的分区键要完全相同。广播表Broadcast Table 指所有的分片数据源中都存在的表,表结构和表中的数据在每个数.
2020-10-21 21:22:21
894
原创 gitlab api 使用
PRIVATE-TOKEN 设置:登录gitlab 进入 User Settings -> Access Tokens查看自己拥有的projectcurl --header "PRIVATE-TOKEN:your-private-token" https://your-gitlab-server/api/v4/projects查看project的membercurl --header "PRIVATE-TOKEN:your-private-token" "https://your-git
2020-10-21 21:18:19
1302
原创 ReentrantLock源码阅读jdk1.8
ReentrantLock(jdk1.8)源码阅读 ReentrantLock,即可重入锁(Java环境下,synchronized也是可重入锁),是唯一实现了Lock接口的类。ReentrantLock主要构成为:含有一个抽象内部类Sync,它继承自AbstractQueuedSynchronizer,即AQS,Sync有两个子类,分别是FairSync和NonfairSync。主要方法有:ReentrantLock类的lock(),unlock(),tryLock()和AQS类的acquire(
2020-07-24 11:30:15
489
原创 HashMap在多线程并发情况下不安全的原因
为什么HashMap不是线程安全的线程T1和T2同时对一个HashMap进行put操作,如产生hash碰撞,正常情况下,会形成链表,并发情况下,有可能T2线程会覆盖T1线程put的元素。线程T1和T2同时对一个HashMap进行resize操作,因jdk1.7中,扩容时,移动元素生成新链表是按头插法进行的,可能出现循环链表,使得get一个不存在的元素,且该元素索引位置在循环链表位置时,造成对环形链表的死循环遍历,在jdk1.8中不会。所以,HashMap的线程不安全主要体现如下:在JDK1.7中
2020-07-11 01:22:51
1035
1
原创 ConcurrentHashMap源码阅读jdk1.8
ConcurrentHashMap源码(jdk1.8)阅读ConcurrentHashMap由一个Node数组table构成table元素Node是一个链表结点,在table槽位上的链表元素大于等于8,并且Node数组table的长度大于64时,会转化为树形链表,扩容时,树元素个数小于等于6时,会转化为链表ConcurrentHashMap通过transfer方法扩容,扩容时,先从高位索引遍历数组table,然后再遍历索引处的链表或树,将链表(或树)上结点分成两个链表,一个保留在原来位置,一个向后移
2020-07-11 00:24:35
225
原创 ConcurrentHashMap源码阅读jdk1.7
ConcurrentHashMap源码(jdk1.7)阅读ConcurrentHashMap类主要由一个Segment数组(Segment<K,V>[] segments)构成;Segment是一个ReentrantLock类,含有一个HashEntry<K,V>[]数组(HashEntry<K,V>[] table);Segment的数量size为并发级别concurrencyLevel的大小,默认为 DEFAULT_CONCURRENCY_LEVEL = 16
2020-07-11 00:23:09
207
原创 HashMap源码阅读jdk1.8
HashMap源码(jdk1.8)阅读HashMap类主要由一个Node数组Node<K,V>[] table构成put操作时,如哈希碰撞,元素插入链表是从尾部插入(jdk7是从头部插入)put操作时,如第一次put,即table为空时,则先调用resize,然后put,非第一次,即table.length > 0时,则先put,再resizeresize重新分配元素时,链表上的元素,最多会分为两部分,一部分分配在原来的低位位置,另一部分分配到新扩容的高位位置1. put方法
2020-07-11 00:20:53
182
原创 HashMap源码阅读jdk1.7
HashMap源码(jdk1.7)阅读HashMap类主要由一个Entry数组Entry<K,V>[] table构成;1. put方法 public V put(K key, V value) { // 如果table为空,则初始化 if (table == EMPTY_TABLE) { inflateTable(threshold); } // 这里可以看出HashMap的key可以为空
2020-07-11 00:18:10
189
原创 CentOS7上安装Confluence构建企业Wiki
Confluence可以用于构建企业Wiki,安装Confluence需要依赖JDK和MySQL,所以安装前,CentOS7上应先安装好JDK和MySQL。在此基础上,安装Confluence步骤如下。1. 开始前的准备工作 Confluence可以用构建企业Wiki,安装Confluence需要依赖JDK和MySQL,所以安装前,CentOS7上应先安装好JDK和MySQL。在此基础上...
2020-01-22 00:27:04
472
原创 js函数定义、调用、闭包
1. 函数定义方法:1.1 具名函数: 1.1.1 function 函数名(参数列表){函数体;} 如:function foo(p){alert(p);} 1.1.2 var 函数名 = function(参数列表){函数体;} 如:var bar = function(p){alert(p);} 1.1.3 var baz = new Function(“x”,...
2020-01-21 01:17:22
350
原创 Confluence数据迁移
将Confluence数据从一台服务器迁移到另一台服务器,总体讲分为三步:复制Confluence安装目录和Confluence Home目录到另一台服务器迁移MySQL数据库到另一台服务器修改Confluence配置文件confluence.cfg.xml数据库连接1. 迁移Confluence1.1 迁移Confluence安装目录[root@localhost ~]# ...
2020-01-21 00:47:48
8927
原创 CentOS7配置阿里云yum源
1 备份系统原源文件$ cd /etc/yum.repos.d/$ mv CentOS-Base.repo CentOS-Base.repo.bak2 下载阿里云源文件$ wget http://mirrors.aliyun.com/repo/Centos-7.repo 如果提示没有wget命令,说明需要安装wget$ yum -y install wget 如果安装失败...
2020-01-21 00:40:19
253
原创 CentOS7 防火墙相关命令
CentOS 7.0默认使用的是firewall作为防火墙,代替了原来CentOS6的iptables。查看防火墙状态:$ firewall-cmd --state# 或者$ systemctl status firewall开启/关闭防火墙:# 开启$ systemctl start firewalld.service# 关闭$ systemctl sto...
2020-01-21 00:36:47
189
原创 CentOS7安装MySQL
CentOS7安装MySQL1 先检查系统是否装有MySQL$ rpm -qa | grep mysql 返回空值,说明没安装,如果有安装,则删除可用:$ yum remove mysql 注意:这里执行安装命令yum install mysql是无效的,因为centos-7默认是Mariadb,所以它只是更新Mariadb数据库。2 下载MySQL 从 MySQL 官网选...
2020-01-21 00:29:09
168
原创 MySQL创建数据库指定编码与排序规则和授权连接
1. 创建数据库,指定utf8编码和utf8_bin排序mysql> create database if not exists mall default character set utf8 collate utf8_bin;2. 添加新用户mysql> create user 'username'@'%' identified by '123456';# ormysql...
2020-01-21 00:25:24
818
原创 CentOS7安装SonarQube6.7
0. 准备工作 前提需要安装好JDK8及MySQL5.6+。1. 下载 从官网https://www.sonarqube.org/downloads/下载sonarqube-6.7.3.zip压缩包。2. 解压 上传到服务器后,解压。[root@localhost sonar]# unzip sonarqube-6.7.3.zip -d /opt3. 配置MySQL数据库 ...
2020-01-21 00:22:57
467
翻译 内置Tomcat还是外部Tomcat?
1. 来自 www.quora.com 的答案原文: https://www.quora.com/Is-it-better-to-run-a-Spring-Boot-application-in-an-external-Tomcat-compared-to-internalIs it better to run a Spring Boot application in an extern...
2019-12-25 13:35:10
643
原创 Spring Boot + MySQL + MyBatis + Maven + Logging + Thymeleaf 项目搭建、配置、运行、部署完整教程
1. 创建一个springboot应用1.1 创建 springboot应用没有相应的archetype,不能通过mvn generate:archetype创建,一般有两种方式创建一个springboot应用:访问 https://start.spring.io/,选择Web依赖,点击Generate Project 创建一个springboot应用。通过IDEA:File ->...
2019-12-25 12:52:32
630
原创 Redis 下载、安装、启动
1. 下载 从地址:https://github.com/MicrosoftArchive/redis/releases 下载文件Redis-x64-3.2.100.zip。2. 解压 解压文件 Redis-x64-3.2.100.zip 得到文件夹 Redis-x64-3.2.100。3. 启动 在 Redis-x64-3.2.100 路径下:2.1 在一个d...
2018-03-30 23:06:23
446
原创 Git 版本回退
版本回退问题,不同场景下,解决方案是不一样的。总的来说,涉及两个Git命令,即 git revert 和 git reset,所以要想掌握版本回退,必须理解这两个命令到底做了什么。1. git revert 与 git reset 的比较 理解这两个命令的区别,参看 git revert 与 git reset 的比较:https://blog.youkuaiyun.com/leonliu0...
2018-03-29 19:03:20
426
原创 git revert 与 git reset 的比较
git revert 与 git reset 的比较 这两个命令的操作完全不同。设当前分支是dev1。1. 对于git revert 以如下命令为例, $ git revert c1 该命令会重新生成一个新的提交 c2,其父提交是当前dev1指针指向的提交(如果当前指向c1,则父提交就是c1),c2 的内容与 c1 的内容相反,即生成一个反向提交,并向前移动 dev1...
2018-03-29 18:51:07
1061
原创 查看端口占用及相关进程信息
1. Windows系统 1.1 netstat 查看某一端口占用情况$ netstat -o活动连接 协议 本地地址 外部地址 状态 PID TCP 10.0.102.71:4559 223.167.166.59:https ESTABLISHED 4968 如查看 8080 ...
2018-03-27 21:23:19
827
原创 Git内部原理
Git内部原理 从根本上讲Git是一个内容寻址(content-addressable)文件系统,并在此之上提供了一个版本控制系统的用户界面。 内容寻址文件系统,意味着,Git的核心部分是一个简单的键值对数据库(key-value data store)。 .git目录包含了几乎所有Git存储和操作的对象。如若想备份或复制一个版本库,只需把这个目录拷贝至另一处即可。初始.gi...
2018-03-27 10:33:42
676
原创 ActiveMQ安装与使用
ActiveMQ ActiveMQ是一款开源的JMS(Java Message Service)的具体实现。ActiveMQ是一个易于使用的消息中间件(Message Orient Middleware, MOM)。 Apache ActiveMQ ™ is the most popular and powerful open source messaging and Integ...
2018-03-23 19:50:34
354
原创 git tag 应用(打标签)
Git 可以给历史中的某一个提交打上标签,以示重要。比较有代表性的是人 们会使用这个功能来标记发布结点(v1.0 等等)1. git tag 列出标签$ git tag2. 创建标签2.1 标签类型:附注标签(annotated) 附注标签是存储在Git数据库中的一个完整对象。它们是可以被校验的;其中包含打标签者的名字、电子邮件地址、日期...
2018-03-23 06:25:13
6564
原创 git log 应用
查询某次提交的修改内容# 显示某次提交的修改内容$ git show <commit-ID># 显示某次提交的某个文件的修改内容$ git show <commit-ID> filename查看Git上个人代码量git log --author="username" --pretty=tformat: --numstat | awk '{ ad...
2018-03-23 06:21:18
629
原创 Git分支
1. Git的分支 Git的分支,其实本质上仅仅是指向提交对象的可变指针。它会在每次的提交操作中自动向前移动。 由于 Git 的分支实质上仅是包含所指对象校验和(长度为 40 的 SHA-1 值字符串)的文件,所以它的创建和销毁都异常高效。创建一个新分支就像是往一个文件中写入 41 个字节(40 个字符和 1 个换行符),如此的简单能不快吗?2. HEAD指针 Git...
2018-03-23 06:18:20
312
原创 git reset 重置
git reset <commit id>命令,如get reset 831b92会以特定的顺序重写HEAD、Index和Working Directory。有三个选项:--soft 仅仅移动HEAD指针指向提交831b92。仅仅意思是单纯移动指针,不更新INDEX索引区,所以此时git status时会看到绿色的索引区的数据(即上一次提交的内容)。--mixed 会更新I...
2018-03-23 06:16:19
854
原创 Git应用笔记整理(全)
1. Git 配置1.1. git config git config 语法:git config [–环境参数] key value 有三个环境参数:–global 全局配置,写到~/.gitconfig中,即用户路径C:\Users\li.liu下的.gitconfig文件。–local 工作目录配置,即所在仓库的配置,写到当前仓库下的.git/config文件中。...
2018-03-23 06:10:54
980
翻译 SQL索引剖析
SQL索引剖析 “索引使查询更快”是我曾见到过的对索引的最基本解释。尽管它很好地描述了索引最重要的一面,但不幸地是,并不足以体现本书。本章以不是那么肤浅的方式来描述索引结构,但也不会深挖细节。它为本书中讨论的SQL性能方面提供足够的洞察力。 索引是使用create index语句在数据库中建立的一个不同的数据结构。它需要自己的磁盘空间来保存索引表数据的副本。这意味着索引是纯粹的冗余。创...
2018-03-18 23:44:41
491
1
原创 IntelliJ IDEA 对 @Autowired 代码检查报错
1. 问题 IntelliJ IDEA 对@Autowired代码检查报错。 @Autowired private DemoBusinessService businessService;2. 解决(两种方案)方案1:添加注解 @SuppressWarnings("SpringJavaAutowiringInspection") @Autowi...
2018-02-22 10:39:57
17897
2
原创 测试插件maven-surefire-plugin
1. 配置1.1 参考:http://maven.apache.org/surefire/maven-surefire-plugin/ 1.2 配置: plugin> groupId>org.apache.maven.pluginsgroupId> artifactId>maven-surefire-pluginartifactId
2018-02-02 14:03:00
382
转载 Gradle仓库
转自:https://docs.gradle.org/4.4.1/userguide/dependency_management.html#sec:repositories25.6. RepositoriesGradle repository management, based on Apache Ivy, gives you a lot of freedom regarding r
2018-01-10 19:43:22
3243
原创 一个简单的Gradle脚本文件
通过一个简单的Gradle脚本文件理解其主要语法:// build.gradle 文件// 建议运行在JDK1.8下,Gradle5.0将不再支持JDK1.7的运行// Support for running Gradle using Java 7 has been deprecated and is scheduled to be removed in Gradle 5.0.// 定
2018-01-09 17:32:50
4065
原创 Gradle应用简介
1. 存储库 默认情况下,Gradle不定义任何存储库。我们必须至少明确地定义一个存储库。2. 显示帮助信息$ gradle --help 执行 gradle --help 可查看gradle命令语法及各选项意义,如下:$ gradle --helpUSAGE: gradle [option...] [task...]-?, -h, --help
2018-01-09 17:12:42
604
原创 Gradle多项目构建
1. 多项目构建的结构在项目的根目录或主目录中都有一个settings.gradle文件。根目录或主目录都有一个build.gradle文件。具有自己的*.gradle构建文件的子目录(某些多项目构建可能会省略子项目构建脚本)。1.1 列出构建文件中的所有项目$ gradle -q projects2. 指定常规构建配置 在根项目中的build.grad
2018-01-09 15:16:17
495
原创 Gradle构建Java项目
1. 添加Java插件 使用Gradle构建文件来构建一个Java项目。首先,我们必须向构建脚本中添加Java插件,因为它提供了编译Java源代码,运行单元测试,创建Javadoc和创建JAR文件的任务。 在build.gradle文件中使用以下代码行。apply plugin: 'java'2. Java默认的项目布局 每当添加一个插件到构建中,它会假设一个特定
2018-01-08 19:29:34
575
原创 Java编程思想读书笔记(八)第21章-并发
线程可以驱动任务,因此你需要一种描述任务的方式,这可以由Runnable接口来提供。要想定义任务,只需实现Runnable接口并编写run()方法,使得该任务可以执行你的命令。当从Runnable导出一个类时,它必须具有run()方法,但是这个方法并无特殊之处——它不会产生任何内在的线程能力。要实现线程行为,你必须显式地将一个任务附着到线程上。线程的一个额外好处是它们提供了轻量级的执行上下文切换(大约100条指令),而不是重量级的进程上下文切换(要上千条指令)。
2018-01-06 22:32:40
2666
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人