Guava缓存使用

Guava是Google提供的Java工具框架,包括一些工具类,Java集合框架的扩展,还有更重要的guava cache。

相比Java的HashMap,ConcurrentHashMap,提供更加灵活的配置和功能,比如控制缓存大小,缓存过期时间等,来试试。

版本

我使用了Guava最新的版本20.0
Gradle,

1
compile("com.google.guava:guava:20.0")

阅读全文

Redis在windows中安装测试

开始学习入门Redis。

安装

作者本人没有Linux服务器,用来安装和部署,只能寻求Windows版本。官方说明,windows版本交由Microsoft Open Tech Group来管理。具体Windows和Linux版本在使用上,有没有区别?一边学习一边跟进。

阅读全文

iText框架介绍与应用

在工作中,需要结合html和image以及动态的信息(Business Model)生成一些静态信息,比如widget,图片,PDF。在google中找到iText框架,帮忙解决html转换为PDF的方案。

阅读全文

固定长度有序链表设计

在工作中,经常调用下游服务获取数据,如果数据未按照要求排序,那么需要我们自己来处理,过滤需要的数据。写了个简单的链表结点类,总结一下。

代码

完全脱离公司业务的,代码不多,贴出来,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
class SequenceNode<T> {
int sequence;
double key;
T value;
int maxLength;
SequenceNode<T> next;

SequenceNode(T value,int max,int sequence,double key){
this.value = value;
this.maxLength = max;
this.sequence = sequence;
this.key = key;
}

SequenceNode<T> insertAndOrder(T poi,double key) {
//1. new node is less than head
if(this.key >= key){
//if full , then will remove last one
if(isFull()){
removeLast();
}
SequenceNode<T> newHead = new SequenceNode<T>(poi,maxLength,1,key);
newHead.next = this;
autoIncreaseSequence(newHead);
return newHead;
}else{
SequenceNode<T> insertPoint = findInsertPoint(key);
if(insertPoint != null){
if(isFull()){
removeLast();
}
SequenceNode<T> newNode = new SequenceNode<T>(poi,maxLength,insertPoint.sequence+1,key);
newNode.next = insertPoint.next;
insertPoint.next = newNode;
autoIncreaseSequence(newNode);
}
}

return this;
}

private SequenceNode<T> findInsertPoint(double key) {
//this is head, just skip. begin to compare from next node
SequenceNode<T> current = this;
SequenceNode<T> before = null;
while(current.next != null){
before = current;
current = current.next;
if(current.key >= key){
return before;
}
}

if(!isFull()){
return current;
}
return null;
}

private void autoIncreaseSequence(SequenceNode<T> point) {
SequenceNode<T> current = point.next ;
while(current != null){
current.sequence = current.sequence+1;
current = current.next;
}
}

private boolean isFull() {
return getLastSequence() == maxLength;
}

private void removeLast() {
SequenceNode<T> current = this;
SequenceNode<T> secondLast = null;
while(current.next != null){
secondLast = current;
current = current.next;
}
current = null;
secondLast.next = null;
}

private int getLastSequence() {

SequenceNode<T> last = this;
while(last.next != null){
last = last.next;
}
return last.sequence;
}

public int getSequence(){
return this.sequence;
}

public T getVaue(){
return value;
}

public List<T> convertToList(){
List<T> list = new ArrayList<T>();
SequenceNode<T> current = this;
list.add(current.getVaue());
while(current.next != null){
current = current.next;
list.add(current.getVaue());
}
return list;
}
}

阅读全文

ConcurrentHashMap实现分析与使用

分析线程安全的ConcurrentHashMap是怎么实现的,基于JDK 1.8。能力有限,不能看懂所有的代码。

类图关系

ConcurrentHashMap类中,定义了大量的内部类。。。不画了

阅读全文

ReentrantReadWriteLock实现分析

ReentrantReadWriteLock,顾名思义,支持重入,支持读锁和写锁。

API规范相关说明

跟ReentrantLock一样,支持非公平(默认)和公平模式。
非公平模式下,读锁和写锁的顺序是没有指定的。不断的竞争可能导致其他读或写线程阻塞,但是性能要优于公平锁,减少线程间切换的损耗。
公平模式下,竞争是arrival-order策略,最先阻塞的线程最具竞争。当前锁释放后,最长等待的写锁线程将赋予写锁。没有写锁时,最长等待的读锁获取读锁。
读锁来了,如果现在有写锁或者写锁的阻塞队列不为空,获取读锁的线程将继续阻塞,直到写锁的线程不存在了且写锁阻塞队列为空。也就是说写锁比读锁高一级,有写锁存在,读锁就阻塞,没有写锁了,读锁自己竞争。
写锁来了,如果读锁且写锁都释放了,则抢占。意味着,写锁和读锁都木有阻塞的线程。
重入,写锁线程可以在释放锁的情况下,获取读锁,反之不允许。这也是锁降级的特性。
通用实现,CachedData,加入volatile的flag,再加double check实现写方法。
最大的锁数,65535写锁和读锁。

阅读全文

应用性能优化检查列表

在性能优化这块,自己完全是个菜鸟水平,把一些很好的学习资料列举出来,借鉴学习。

一份平民化的应用性能优化检查列表(上篇)

阅读全文

ReentrantLock实现分析

ReentrantLock,实现Lock接口,重入锁,少废话,开始分析。

Lock接口声明的方法:

  • void lock(),阻塞获取锁。
  • void lockInterruptibly() throws InterruptedException,阻塞获取锁,但是支持中断,如果线程中断,也可返回,抛出InterruptedException。

阅读全文

Java中的锁

在Java 1.5以后,提供了Lock接口,实现锁的功能,相比synchronized,显示的进行锁操作,并提供更多的灵活的功能。

Lock接口

提供与synchronized关键字类似的同步功能,可以显示地获取和释放所,尝试非阻塞地获取锁,能被中断地获取锁(支持中断操作),超时获取锁(超时退出)等。

阅读全文

Java线程

线程,是并发编程的基础,操作系统运行的最小单元,进程可以拥有线程,线程也称为轻量级进程,同一进程的线程是可以共享进程的内存的。

线程简介

为什么要使用线程?冯诺依曼运算体系,目前没啥大的突破,处理器不断升级,升级频率,升级内核数量,更快的响应的,提供更好的并发编程模型。

阅读全文