为了账号安全,请及时绑定邮箱和手机立即绑定

设计模式-六大设计原则 原创

1.单一职责原则 一个类,应该只有一个引起变化的原因、只有一个职责。每一个职责都是变化的一个轴线,如果一个类有一个以上的职责,这些职责就耦合在一起,这会导致脆弱的设计。当一个职责发生变化时,可能会影响其他的职责。另外,多个职责偶合在一起,会影响复用性。 简单说:一个类只负责一项职责。 问题:比如一个类 T 负责两个不同的职责:职责 P1、职责 P2。当由于职责 P1 需要发生改变而需要修改类 T1 时,有可能会导致原本运行正常的职责 P2 功能发生故障。 解决方法:遵

876浏览
1推荐
0评论

Maven之私服配置 原创

一.配置从私服下载 从私服下载主要是将 central 库的下载地址从https://repo1.maven.org/maven2/修改为私服地址,比如http://localhost:8081/repository/maven-public/。然后配置好访问私服的用户名和密码即可。 了解settings.xml文件结构 <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"...

5148浏览
1推荐
0评论

并发中的volatile 原创

[TOC] 1. 概述 由于线程有本地内存的存在, 一个线程修改的共享变量不会及时的刷新到主内存中, 使得另一个线程读取共享变量时读取到的仍旧是旧值, 就导致了内存可见性问题. 现在volatile就可以解决这个问题, 为什么能解决内存可见性问题呢? 本文就来揭开volatile的神秘面纱. 2. volatile的特性 理解volatile特性的一个好方法就是把对volatile单个变量的读/写, 看成是使用同一个锁对单个变量的读/写做了同步. 锁的happens-before规则保证释放锁和获取锁的两个线程之间的内存可见性,

1300浏览
3推荐
0评论

JMM中的重排序和内存屏障 原创

[TOC] 1. 概述 在执行程序时, 为了提高性能, 编译器和处理器常常会对指令做重排序. 为了实现某些功能有时会禁止某些重排序, 由此引入了内存屏障. 2. 重排序 重排序虽然可以提高程序性能, 但是编译器和处理器不会改变存在数据依赖关系的两个操作的执行顺序. 即: 编译器和处理器在重排序时, 会遵 守数据依赖性. 这里说的数据依赖性仅针对单个处理器中执行的指令序列和单个线程中执行的操作, 不同处理器之间和不同线程之间的数据依赖性不被编译器和处理器考虑. as-if-serial语义

1449浏览
0推荐
0评论

jdk1.6及以上版本对synchronized的优化 原创

[TOC] 1. 概述 在多线程并发编程中synchronized一直是元老级角色, 很多人都会称呼它为重量级锁. 但是, 随着Java SE 1.6对synchronized进行了各种优化之后, 有些情况下它就并不那么重了. 本文详细介绍Java SE 1.6中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁, 以及锁的存储结构和升级过程. 2. 实现同步的基础 Java中的每个对象都可以作为锁. 具体变现为以下3中形式. 对于普通同步方法, 锁是当前实例对象. 对于静态同步方法, 锁是当前类的Class对象. 对

2824浏览
3推荐
0评论

HashMap源码分析 原创

[TOC] 1. 概述 HashMap是一种key/value形式的存储结构. 它综合了数组(查询容易, 插入和删除困难)和链表(插入和删除容易, 查询困难)的特点. HashMap的核心点就是hash算法和红黑树算法. HashMap是无序的. 2. 存储结构 HashMap的存储结构为数组 + 链表/红黑树. 其中数组就是普通的数组, 链表是为了解决hash冲突而产生的, 如果冲突元素大于指定值, 就会由链表变为红黑树, 如果冲突元素少于指定的值, 就会由红黑树变为链表. 2-1. 什么是hash冲突? 当产生hash冲突的时候就产生了

1957浏览
5推荐
1评论

LinkedList源码分析 原创

[TOC] 1. 概述 通过类名可以想象到, 该类的结构是一个链表结构. 但是它是一个类似于数组的链表, 意思就是普通的添加操作与数组类似, 将新元素添加到链表的尾端. 并支持通过下标来进行访问. 它实现了Deque接口, 提供了栈和队列的操作, 也就是该类的主要功能吧. 对于元素的增删改比ArrayList强; 对于元素的查询不如ArrayList. 2. 构造函数 它提供了两个构造函数, 比ArrayList少一个构造方法那就是没有提供带有初始化容量的构造方法, 也是与该类的存储结构有关. 因为是链表结构,

1857浏览
0推荐
0评论

ArrayList源码分析 原创

[TOC] 1. 概述 为了弥补普通数组无法自动扩容的不足, Java提供了集合类, 其中ArrayList就对数组进行了封装, 使其可以自动的扩容或缩小长度. 因为是对数据进行了封装, 所以底层存储结构是数组结构. 可以想象的到, 数组长度的自动变化必须需要开辟新内存, 然后进行数组元素的拷贝. 因为数组, 所以ArrayList也就具有数组的一些性, 如支持随机访问. 2. 存储结构 第一节已经说了, 它是一种自动数组, 内部存储结构就是数组了. Object[] elementData; 3. 构造方法 先从构造方法

2228浏览
1推荐
0评论

MySQL字符集介绍及配置 原创

MySQL编码集 查看MySQL支持的字符集 mysql> show character set; 查看MySQL当前的字符集 mysql> show variables like 'character%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | |...

1914浏览
0推荐
0评论

浅谈Log4j2日志框架及使用 原创

[TOC] 日志框架 日志接口(slf4j) slf4j是对所有日志框架制定的一种规范、标准、接口,并不是一个框架的具体的实现,因为接口并不能独立使用,需要和具体的日志框架实现配合使用(如log4j、logback) 日志实现(log4j、logback、log4j2) log4j是apache实现的一个开源日志组件 logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架,是slf4j的原生实现 log4j2是log4j 1.x和logback的改进版,据说采用了一些新技术(无锁异步、等等),使得日志的吞吐量、性能

20683浏览
6推荐
4评论
意见反馈 帮助中心 APP下载
官方微信