Java
文章平均质量分 90
leonliu06
软件开发工程师
展开
-
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 · 438 阅读 · 0 评论 -
读懂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 · 318 阅读 · 0 评论 -
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 · 973 阅读 · 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 · 210 阅读 · 0 评论 -
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 · 189 阅读 · 0 评论 -
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 · 163 阅读 · 0 评论 -
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 · 170 阅读 · 0 评论 -
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 · 320 阅读 · 1 评论 -
IntelliJ IDEA 对 @Autowired 代码检查报错
1. 问题 IntelliJ IDEA 对@Autowired代码检查报错。 @Autowired private DemoBusinessService businessService;2. 解决(两种方案)方案1:添加注解 @SuppressWarnings("SpringJavaAutowiringInspection") @Autowi...原创 2018-02-22 10:39:57 · 17854 阅读 · 2 评论 -
Gradle应用简介
1. 存储库 默认情况下,Gradle不定义任何存储库。我们必须至少明确地定义一个存储库。2. 显示帮助信息$ gradle --help 执行 gradle --help 可查看gradle命令语法及各选项意义,如下:$ gradle --helpUSAGE: gradle [option...] [task...]-?, -h, --help原创 2018-01-09 17:12:42 · 580 阅读 · 0 评论 -
Gradle多项目构建
1. 多项目构建的结构在项目的根目录或主目录中都有一个settings.gradle文件。根目录或主目录都有一个build.gradle文件。具有自己的*.gradle构建文件的子目录(某些多项目构建可能会省略子项目构建脚本)。1.1 列出构建文件中的所有项目$ gradle -q projects2. 指定常规构建配置 在根项目中的build.grad原创 2018-01-09 15:16:17 · 460 阅读 · 0 评论 -
一个简单的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 · 4020 阅读 · 0 评论 -
Maven快速入门及应用
Apache Maven [‘meɪv(ə)n] 是一个软件项目管理和综合工具。基于项目对象模型(POM,Project Object Model)的概念,Maven可以从一个中心资料片管理项目构建,报告和文件。1 安装到Maven官方网站下载 Maven 的 zip 文件,如: apache-maven-3.3.3-bin.zip,解压。添加环境变量M2_HOME 和 MAVEN_HOME,原创 2017-11-21 12:00:16 · 421 阅读 · 0 评论 -
应用Maven-Assembly-Plugin插件构建可执行软件包
应用Maven-Assembly-Plugin插件构建可执行软件包。原创 2017-12-02 21:52:42 · 600 阅读 · 0 评论 -
Gradle构建Java项目
1. 添加Java插件 使用Gradle构建文件来构建一个Java项目。首先,我们必须向构建脚本中添加Java插件,因为它提供了编译Java源代码,运行单元测试,创建Javadoc和创建JAR文件的任务。 在build.gradle文件中使用以下代码行。apply plugin: 'java'2. Java默认的项目布局 每当添加一个插件到构建中,它会假设一个特定原创 2018-01-08 19:29:34 · 543 阅读 · 0 评论 -
Linux下安装jdk7
Linux下安装jdk7 一般ubuntu可能会自带默认的JDK,如openjdk, 所以,为了将我们安装的JDK设置为默认的JDK版本,要么把原来的openjdk卸载掉,要么就需要配置我们安装的JDK作为默认JDK版本。原创 2017-11-09 22:36:11 · 568 阅读 · 0 评论 -
Java编程思想(二)第14章-类型信息
目录:Java编程思想(一)第1~13、16章 Java编程思想(二)第14章-类型信息 Java编程思想(三)第15章-泛型 Java编程思想(四)第17章-容器深入研究 Java编程思想(五)第18章-Java IO系统 Java编程思想(六)第19章-枚举类型 Java编程思想(七)第20章-注解 Java编程思想(八)第21章-并发1. RTTI(Runtime Ty原创 2018-01-06 21:50:36 · 3520 阅读 · 1 评论 -
Java编程思想读书笔记(三)第15章-泛型
我相信被称为泛型的通用语言特性(并非必须是其在Java中的特定实现)的目的在于可表达性,而不仅仅是为了创建类型安全的容器。类型安全的容器是能够创建更通用代码这一能力所带来的副作用。泛型正如其名称所暗示的:它是一种方法,通过它可以编写出更“泛化”的代码,这些代码对于它们能够作用的类型有更少的限制,因此单个的代码段能够应用到更多的类型上。原创 2018-01-06 21:58:30 · 2208 阅读 · 1 评论 -
Java编程思想读书笔记(四)第17章-容器深入研究
存储一组元素最快的数据结构是数组,所以用它来表示键的信息(请小心留意,我是说键的信息,而不是键本身)。但是因为数组不能调整容量,因此就有一个问题:我们希望在Map中保存数量不确定的值,但是如果键的数量被数组的容量限制了,该怎么办?更高的负载因子可以降低表所需的空间,但会增加查找代价,这很重要,因为查找是我们在大多数时间里所做的操作(包括。因为get()是使用最多的操作,求余数的%操作是其开销最大的部分,而使用2的整数次方可以消除此开销(也可能对hashCode()有些影响)。Java容器类类库采用。原创 2018-01-06 22:10:22 · 2045 阅读 · 1 评论 -
Java编程思想读书笔记(五)第18章-Java IO系统
ByteBuffer依然是实际存储数据的地方,“支持”着前面的视图,因此对视图的任何修改都会映射成为对ByteBuffer中数据的修改。我们可以通过一个字节数组来使用对象序列化,从而实现对任何可Serializable对象的“深度复制”(deep copy)——深度复制意味着我们复制的是整个对象网,而不仅仅是基本对象及其引用。文件加锁对其他的操作系统进程是可见的,因为Java的文件加锁直接映射到了本地操作系统的加锁工具。缓冲器容纳的是普通的字节,为了把它们转换成字符,我们要么在输入它们的时候对其进行。原创 2018-01-06 22:20:12 · 1592 阅读 · 1 评论 -
Java编程思想读书笔记(六)第19章-枚举类型
所有的enum类都继承自java.lang.Enum类。由于Java不支持多重继承,所以你的enum类不能再继其他类,然而,在我们创建一个新的enum时,可以同时实现一个或多个接口。通过相应的enum实例,我们可以调用其上的方法。这通常也称为表驱动的代码(table-driven code,请注意它与前面提到的命令模式的相似之处)。编译器将枚举类(enum)标记为final类,所以enum类无法被继承。与EnumSet一样,enum实例定义时的次序决定了其在EnumMap中的顺序。原创 2018-01-06 22:22:34 · 1030 阅读 · 0 评论 -
Java编程思想读书笔记(七)第20章-注解
目录:Java编程思想(一)第1~13、16章 Java编程思想(二)第14章-类型信息 Java编程思想(三)第15章-泛型 Java编程思想(四)第17章-容器深入研究 Java编程思想(五)第18章-Java IO系统 Java编程思想(六)第19章-枚举类型 Java编程思想(七)第20章-注解 Java编程思想(八)第21章-并发 注解(也被称为元数据)为我们在代原创 2018-01-06 22:24:40 · 1130 阅读 · 1 评论 -
Java编程思想读书笔记(八)第21章-并发
线程可以驱动任务,因此你需要一种描述任务的方式,这可以由Runnable接口来提供。要想定义任务,只需实现Runnable接口并编写run()方法,使得该任务可以执行你的命令。当从Runnable导出一个类时,它必须具有run()方法,但是这个方法并无特殊之处——它不会产生任何内在的线程能力。要实现线程行为,你必须显式地将一个任务附着到线程上。线程的一个额外好处是它们提供了轻量级的执行上下文切换(大约100条指令),而不是重量级的进程上下文切换(要上千条指令)。原创 2018-01-06 22:32:40 · 2596 阅读 · 1 评论 -
Java编程思想读书笔记(一)第1~13、16章
目录:Java编程思想(一)第1~13、16章 Java编程思想(二)第14章-类型信息 Java编程思想(三)第15章-泛型 Java编程思想(四)第17章-容器深入研究 Java编程思想(五)第18章-Java IO系统 Java编程思想(六)第19章-枚举类型 Java编程思想(七)第20章-注解 Java编程思想(八)第21章-并发第1章 对象导论1.1原创 2017-11-26 18:54:06 · 42757 阅读 · 15 评论 -
Tomcat 7 快速入门及应用
1. 什么是Tomcat Tomcat是当今最流行的一种Servlet/JSP容器。2. 什么是上下文 简单理解就是一个Web应用程序启动后,程序中所有内存对象和他们之间的关系组成的一种环境。代码上其实就是javax.servlet.ServletContext这个类。 安装在一个服务器的一个特定URL名字空间(比如,/myapplication)下的所有Servlet,JSP,Ja原创 2017-11-21 21:27:45 · 907 阅读 · 0 评论 -
IntelliJ IDEA导入主题包
导入主题 file –> import setttings –> 选中下载的主题jar文件 –> 一路确认 –> 重启原创 2017-11-20 21:30:51 · 17153 阅读 · 5 评论