0%

双重检查模式

以双重检查模式为例

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Singleton {
private static Singleton singleton;
public static Singleton getSingleton(){
if(singleton==null){
synchronized (Singleton.class){
if(singleton==null){
singleton=new Singleton();
}
}
}
return singleton;
}
}
阅读全文 »

基本区别

1.线程安全

Hashtable是线程安全,HashMap是非线程安全。HashMap的性能会高于Hashtable,我们平时使用时若无特殊需求建议使用HashMap,在多线程环境下若使用HashMap需要使用Collections.synchronizedMap()方法来获取一个线程安全的集合,HashTable中的方法添加了synchronized

阅读全文 »

面试时被问到LRU的实现,决定尝试使用Java实现一下

一、基于LinkedHashMap

LinkedHashMap中使用了hashmap和双链表,只要重写removeEldestEntry方法,就会在超过固定大小时移除最早的节点

阅读全文 »

原算法参考文章
负载均衡算法 — 平滑加权轮询

本文只是实现了其Java版本

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
public class LoadBalance {
public static void main(String[] args) {
int[] config_weight=new int[3];//配置权重
Map<Integer,String> map=new HashMap<>();
map.put(0,"A");
map.put(1,"B");
map.put(2,"C");
config_weight[0]=5;
config_weight[1]=1;
config_weight[2]=1;
int[] eff_weight=config_weight.clone();//有效权重,初始化为配置权重
List<String> list=new ArrayList<>();
for(int i=0;i<7;i++){
list.add(getServer(config_weight,eff_weight,map));
}
System.out.println(list);

}
public static String getServer(int[] config_weight,int[] eff_weight,Map<Integer,String> map){
int currentPos=-1;
int max=0;
int curWeightSum=0;
for(int i=0;i<eff_weight.length;i++){
if(eff_weight[i]>max){
currentPos=i;
max=eff_weight[i];
}
curWeightSum+=eff_weight[i];
}
eff_weight[currentPos]-=curWeightSum;
for(int i=0;i<eff_weight.length;i++){
eff_weight[i]=eff_weight[i]+config_weight[i];
}
return map.get(currentPos);
}
}

使用密码登陆远端云服务器,进入~/.ssh
执行:

1
ssh-keygen
1
2
3
Enter file in which to save the key (/home/eai/.ssh/id_rsa):    <====== enter 确认
Enter passphrase (empty for no passphrase):    <====== 输入密钥密码锁,或者直接enter默认无密码
Enter same passphrase again:    <====== 再次输入密钥密码锁
阅读全文 »

方法区

方法区与 Java 堆一样,是各个线程共享的内存区域,它用于存储常量池、域、方法数据、方法体、构造函数、类中专用方法、实例初始化、接口初始化等数据,其大小可以通过参数来设置。通常方法区存储区域的大小在程序启动后就是固定的了,JVM运行一段时间后,需要加载的类通常都已经加载到JVM中了。
《Java 虚拟机规范》只是规定了有方法区这么个概念和它的作用,并没有规定如何去实现它。
同时,在JDK1.7开始,原本规定在方法区中的常量池移了出来,在Java堆中中开辟了一块区域存放。

阅读全文 »

原因

网站中有很多地方都存在表单重复提交的问题,为了防止用户有意或者恶意的重复提交表单,都应该考虑设计防止表单重复提交的机制
要防止表单的重复提交,就要标识用户的每一次访问请求,使得每一次访问对于服务端来说都是唯一确定的,为了标识用户的每次访问请求,可以在用户请求的一个表单域增加一个隐藏表单项,这个表单项的值每次都是唯一的token,如:

阅读全文 »

内存映射概念

这个功能主要是为了提高大文件的读写速度而设计的。内存映射文件(memory-mappedfile)能让你创建和修改那些大到无法读入内存的文件。大多数操作系统都可以利用虚拟内存实现来讲一个文件或者文件的一部分“映射”到内存中,然后,这个文件就可以当作内存数组一样的访问。将文件的一段区域映射到内存中,比传统的文件处理速度要快很多。内存映射文件它虽然最终也是要从磁盘读取数据,但是它并不需要将数据读取到OS内核缓冲区,而是直接将进程的用户私有地址空间中的一部分区域与文件对象建立起映射关系,就好像直接从内存中读、写文件一样,速度会大大加快。

阅读全文 »