松花皮蛋的黑板報
  • 分享在京東工作的技術感悟,還有JAVA技術和業內最佳實踐,大部分都是務實的、能看懂的、可復現的

掃一掃
關注公眾號

ARTS-8-JAVA內存模型

博客首頁文章列表 松花皮蛋me 2019-05-05 21:53

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-注解配置剖析

黑龙江6+1开奖结果查询