开始学习入门Redis。
作者本人没有Linux服务器,用来安装和部署,只能寻求Windows版本。官方说明,windows版本交由Microsoft Open Tech Group来管理。具体Windows和Linux版本在使用上,有没有区别?一边学习一边跟进。
在工作中,需要结合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
110class 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;
}
}
ReentrantReadWriteLock,顾名思义,支持重入,支持读锁和写锁。
跟ReentrantLock一样,支持非公平(默认)和公平模式。
非公平模式下,读锁和写锁的顺序是没有指定的。不断的竞争可能导致其他读或写线程阻塞,但是性能要优于公平锁,减少线程间切换的损耗。
公平模式下,竞争是arrival-order策略,最先阻塞的线程最具竞争。当前锁释放后,最长等待的写锁线程将赋予写锁。没有写锁时,最长等待的读锁获取读锁。
读锁来了,如果现在有写锁或者写锁的阻塞队列不为空,获取读锁的线程将继续阻塞,直到写锁的线程不存在了且写锁阻塞队列为空。也就是说写锁比读锁高一级,有写锁存在,读锁就阻塞,没有写锁了,读锁自己竞争。
写锁来了,如果读锁且写锁都释放了,则抢占。意味着,写锁和读锁都木有阻塞的线程。
重入,写锁线程可以在释放锁的情况下,获取读锁,反之不允许。这也是锁降级的特性。
通用实现,CachedData,加入volatile的flag,再加double check实现写方法。
最大的锁数,65535写锁和读锁。
ReentrantLock,实现Lock接口,重入锁,少废话,开始分析。
Lock接口声明的方法: