扫一扫
关注公众号
ARTS的初衷
Algorithm: 主要是为了编程训练和学习。
Review:主要是为了学习英文
Tip:主要是为了总结和归纳在是常工作中所遇到的知识点。学习至少一个技术技巧。在工作中遇到的问题,踩过的坑,学习的点滴知识。
Share:主要是为了建立影响力,能够输出价值观。分享一篇有观点和思考的技术文章
https://www.zhihu.com/question/301150832
JSR 133 (Java Memory Model) FAQ JAVA内存模型
1、JAVA分为”一级缓存”本地内存和主内存,内存屏障会强制刷新本地内存或者将其不可见,以使得线程对某个变量的修改对其他线程可见
2、重排序(recordering),比如JIT编译器优化时,会破坏在程序中定义的执行顺序
3、synchronization做了什么?synchronization是一个排它锁,当获取监器器时(acquire the monitor),会将本地内存不可见,变量会从主内存重新加载。当释放(release)一个监视器时,会强制刷新本地内存至主内存
4、逃逸分析,将一个对象引用另外一个对象时,如果引用对象对其他线程可见的话,会出现线程安全问题
5、final类型对其他任何线程都是可见的,那怕不使用synchronization
6、volatile做了什么?保证可见性
7、”double-checked kocking”问题原因分析,另外推荐使用单例模式的“Initialization On Demand Holder idiom”延迟初始化实现方案
8、happen-before原则
补充:JVM内存结构、Java内存模型和Java对象模型
使用MessageFormat批量插入
StringBuilder sb = new StringBuilder();
sb.append("insert into "+tableName+"(`type`,`domain`,`timestamp`,`value`,`createTime`) VALUES");
MessageFormat messageFormat = new MessageFormat("(#'{'list[{0}].type},#'{'list[{0}].domain}," +
"#'{'list[{0}].timestamp},#'{'list[{0}].value},#'{'list[{0}].createTime})");
for(int i = 0 ;i<deepLogQpsList.size();i++) {
sb.append(messageFormat.format(new Object[]{String.valueOf(i)}));
if (i < deepLogQpsList.size() - 1) {
sb.append(",");
}
}
return sb.toString();
当MessageFormat.format()参数是整形的时候,比如1000,会导致mybatis解析错误,nested exception is org.apache.ibatis.builder.BuilderException: Parsing error was found in mapping #{list[1,000].type}. Check syntax #{property|(expression), var1=value1, var2=value2, …},正确的做法是进行字符串转换