ARTS-8-JAVA内存模型

松花皮蛋me 2019-05-05 21:53
文章首发于公众号 松花皮蛋的黑板报松花皮蛋的黑板报,作者就职于京东,在稳定性保障、敏捷开发、高级JAVA、微服务架构有深入的理解

ARTS的初衷

Algorithm: 主要是为了编程训练和学习。

Review:主要是为了学习英文

Tip:主要是为了总结和归纳在是常工作中所遇到的知识点。学习至少一个技术技巧。在工作中遇到的问题,踩过的坑,学习的点滴知识。

Share:主要是为了建立影响力,能够输出价值观。分享一篇有观点和思考的技术文章

https://www.zhihu.com/question/301150832

一、Algorithm

二、Review

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对象模型

JVM内存结构

Java内存模型

Java对象模型

三、Tip

使用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, …},正确的做法是进行字符串转换

四、Share

微服务架构之服务框架Dubbo-注解配置剖析


文章已于2019-06-08 00:13修改,变动:修改文章标题
阅读 232 次