共享变量
共享变量是多线程使用中非常容易出错的地方。我们系统中的单例缓存都是共享变量。
在使用过程中有几点规范或者说要注意的地方
1. 尽量少暴露更新方法
如果说一个共享变量只对外暴露了一个update方法,其余都是read方法,那么多线程引入的并发问题则相对比较好控制,用
synchronized关键字就好。如果是多个则需要使用锁了,暴露的越多,多个方法间越容易有并发问题
2. 双重检查锁
这个是阿里巴巴的Java开发手册里面提到的词语,不好解释直接上代码
public class MyCache {
private Cache cache = null;
public Cache getCache() {
if(cache == null) {
synchronized(this) {
if(cache == null) { // double check
cache = new Cache()
}
}
}
}
}
这里我们的系统中曾经double check那里是没有的,可以想象如果更新一个cache很慢的话,性能会很受影响
3. volatile
这个也是Java开发手册里面提到的,简单看过相关内容,可以解决一写多读,具体的细节还没有看。(如果有大佬懂可以科普一下)
4. SimpleDateFormat
这个是非常著名的SimpleDateFormat。对于这一点我们可以逐渐把系统中的日期使用转换成LocalDateTime系列。之前也发生过SimpleDateFormat引发的并发问题/
网友评论