avatar

正进一步

只有喜欢,才会全情投入,才会成功!!!

不关注架构设计细节的程序员不是一个好架构师

  • Home
  • Tags
  • Categories
  • Archives
  • 2018寄语
66_同步访问共享的可变数量

当多个线程共享可变数据的时候,每个读取或者修改的线程都必须执行同步
Volatile保证读写都是原子的.
Long/Double读取非原子读取,volatile可以保证.

同步的作用:
  • 防止别的线程看到当前线程的中间的不一致状态
  • 保证前一线程修改的结果立即对当前线程可见.
第6条_消除过期的对象引用
  • 将数组中的不用的元素设置为null,尽早垃圾回收

  • 缓存可以使用WeakHashMap.及时将key进行回收。

  • 使用定时器将缓存中不用的项目删除或者LinkedHashMap.removeEldestEntry()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import com.alibaba.druid.support.json.JSONUtils;

import java.util.LinkedHashMap;
import java.util.Map;

public class LinkedHashMapTest {

private static final int MAX_ENTRIES =3;

public static void main(String[] args) {
LinkedHashMap<String,String> linkedHashMap =new LinkedHashMap(){
@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > MAX_ENTRIES;
}
};
linkedHashMap.put("beijing","haid");
linkedHashMap.put("beijing2","haid2");
linkedHashMap.put("beijing3","haid3");
System.out.println(JSONUtils.toJSONString(linkedHashMap));
linkedHashMap.put("beijing4","haid4");
System.out.println(JSONUtils.toJSONString(linkedHashMap));
}
}

输出:

1
2
{"beijing":"haid","beijing2":"haid2","beijing3":"haid3"}
{"beijing2":"haid2","beijing3":"haid3","beijing4":"haid4"}

  • 将监听器回调及时的清除,可以使用WeakHashMap.

  • 使用内存Heap Profiler进行对象分析。

通过Builder模式降低参数数量,增加可读性

参考:http://www.importnew.com/6605.html

  • Builder会增加个类代码,这也意味着开发者在给类增加属性时有时会忘记给该属性添加支持的builder。为了克服这个问题,通常我会将builder嵌套到类中,这样可以很容易地发现哪个相关的builder需要更新

  • 构建对象时,如果碰到类有很多参数——其中很多参数类型相同而且很多参数可以为空时,我更喜欢Builder模式来完成。当参数数量不多、类型不同而且都是必须出现时,通过增加代码实现Builder往往无法体现它的优势。在这种情况下,理想的方法是调用传统的构造函数。再者,如果不需要保持不变,那么就使用无参构造函数调用相应的set方法吧。

  • 必要参数写到构造器里

  • 如果要实现builder的重用性,可以讲初始化工作放到目标类中。不需要重用的话,可以讲初始化工作在builde创建出来的时候,就将实例创建出来。

第4条_通过私有构造器强化不可实例化的能力

将构造器 设置为Private并且要抛出异常,就可以解决这个问题.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public  class UtilsClass {

//子类不能调用父类的构造方式,也就不能有子类了.
//抛出异常是为了 本类中 声明实例对象
private UtilsClass(){
throw new RuntimeException("不可以被初始化");
}

public static void main(String[] args) {

UtilsClass u =new UtilsClass();
System.out.println(u);

}
}