Java學習ing

果真目前水平來看,Java纔是個人正道前端

VO對應於頁面上須要顯示的數據(表單),DO對應於數據庫中存儲的數據(數據表),DTO對應於除兩者以外須要進行傳遞的數據。java

java.util.concurrent.ConcurrentSkipListMap

java.util.concurrent.ConcurrentLinkedQueue

ConcurrentHashMap從JDK1.5開始隨java.util.concurrent包一塊兒引入JDK中,主要爲了解決HashMap線程不安全和Hashtable效率不高的問題。mysql

ConcurrentHashMap在8中 CHM 摒棄了 Segment(鎖段)的概念,而是啓用了一種全新的方式實現,利用CAS算法。JDK1.8 數組+鏈表+紅黑樹數據結構和CAS原子操做實現算法

CAS(Compare-and-Swap),即比較並替換,是一種實現併發算法時經常使用到的技術,Java併發包中的不少類都使用了CAS技術。sql

CAS數據庫

在多線程高併發編程的時候,最關鍵的問題就是保證臨界區的對象的安全訪問。一般是用加鎖來處理,其實加鎖本質上是將併發轉變爲串行來實現的,勢必會影響吞吐量。並且線程的數量是有限的,依賴於操做系統,並且線程的建立和銷燬帶來的性能損耗是不能夠忽略掉的。雖然如今基本都是用線程池來儘量的下降不斷建立線程帶來的性能損耗。編程

對於併發控制而言,鎖是一種悲觀策略,會阻塞線程執行。而無鎖是一種樂觀策略,它會假設對資源的訪問時沒有衝突的,既然沒有衝突就不須要等待,線程不須要阻塞。那多個線程共同訪問臨界區的資源怎麼辦呢,無鎖的策略採用一種比較交換技術CAS(compare and swap)來鑑別線程衝突,一旦檢測到衝突,就充實當前操做指導沒有衝突爲止。數組

與鎖相比,CAS會使得程序設計比較負責,可是因爲其優越的性能優點,以及天生免疫死鎖(根本就沒有鎖,固然就不會有線程一直阻塞了),更爲重要的是,使用無鎖的方式沒有所競爭帶來的開銷,也沒有線程間頻繁調度帶來的開銷,他比基於鎖的方式有更優越的性能,因此在目前被普遍應用,咱們在程序設計時也能夠適當的使用.安全

不過因爲CAS編碼確實稍微複雜,並且jdk做者自己也不但願你直接使用unsafe(後面會講到)來進行代碼的編寫,因此若是不能深入理解CAS以及unsafe仍是要慎用,使用一些別人已經實現好的無鎖類或者框架就行了。

服務器

 

volatile

上面說到當前線程能夠發現其餘線程對臨界區數據的修改,這點可使用volatile進行保證。
volatile實現了JMM中的可見性。使得對臨界區資源的修改能夠立刻被其餘線程看到,它是經過添加內存屏障實現的。具體實現原理請自行搜索**volatile**

MySQL的坑:

MySQL 的「utf8mb4」是真正的「UTF-8」。

MySQL 的「utf8」是一種「專屬的編碼」,它可以編碼的 Unicode 字符並很少。

5.5.3以上,更改方法

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)

 ACID Atomicity Consistency Isolation Durability

CAP Consistency Availability Partition tolerance

 

Springmvc的工做流程

  • User向服務器發送request,前端控制Servelt DispatcherServlet捕獲;

  • DispatcherServlet對請求URL進行解析,調用HandlerMapping得到該Handler配置的全部相關的對象,最後以HandlerExecutionChain對象的形式返回.

  • DispatcherServlet 根據得到的Handler,選擇一個合適的HandlerAdapter.

  • 提取Request中的模型數據,填充Handler入參,開始執行Handler(Controller)

  • Handler執行完成後,返回一個ModelAndView對象到DispatcherServlet

  • 根據返回的ModelAndView,選擇一個適合的ViewResolver

  • ViewResolver 結合Model和View,來渲染視圖

  • 將渲染結果返回給客戶端。

volatile:保證可見性,禁止指令重排序優化,但不保證原子性。

 1)當一個變量定義爲volatile時,它保證了此變量對全部線程可見。當在讀取volatile變量時,會進行load操做(從主內存讀取,放入工做內存變量中)。當=對volatile變量執行寫操做時,會在寫入後,進行store操做(把工做內存變量更新到主內存)。因此volatile具備可見性。

 2)可是,volatile不保證原子性。



做者:Jay_Wei
連接:https://www.jianshu.com/p/3c1691aed1a5
來源:簡書
簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。

synchronized:保證原子性,可見性,有序性(指令重排)

 基於Java內存模型, synchronized執行流程:

 (1)線程得到得到互斥鎖

 (2)清空工做內存

 (3)在主內存中拷貝最新變量的副本到工做內存

 (4)執行完代碼

 (5)將更改後的共享變量的值刷新到內存

(6)釋放互斥鎖

  synchronized通常有兩種使用方式,同步方法和同步代碼塊。Java虛擬機基於進入和退出Monitor對象來實現synchronized代碼塊同步和方法同步,但兩者在字節碼層面的表現略有差異。

1. synchronized同步塊:JVM採用monitorenter、monitorexit兩個指令來實現同步。

2.synchronized方法:對於同步方法,JVM採用ACC_SYNCHRONIZED標記符來實現同步

 即synchronized經過加鎖保證了原子性,可見性,有序性。

相關文章
相關標籤/搜索