原创 2. volatile關鍵字

   一個變量被volatile修飾時,它會保證需要寫回的值會被立即更新到內存,而讀取時也會直接從內存讀取新值。        volatile關鍵字保證了可見性和一定的有序性,而不保證原子性。 保證可見性 //線程1 boolean

原创 6.4 JUC — 可重入鎖

ReentrantLock ReentrantLock實現了Lock接口,而ReentrantLock其實相當於一副空殼,它的主要功能就是控制構造出公平鎖還是非公平鎖,對鎖的相關操作細節都是由內部類Sync來完成。Sync繼承自AQS(A

原创 3. synchronized關鍵字

synchronized的出現打破了volatile關鍵字的侷限性(無法保證原子性和只能修飾單一變量),它可以用來鎖住代碼塊、實例對象、類對象。 synchronized的使用 a. 修飾代碼塊,指定加鎖對象,對給定對象加鎖,進入同步代碼

原创 spring mvc 簡單實例

啓動服務器,加載配置文件(web.xml) 配置DispatcherServlet對象(<servlet>標籤) 加載springmvc.xml(beans配置) 開啓註解掃描,創建Controller對象(@Controller註

原创 6.5 JUC — 同步器

同步器名稱 作用 CountDownLatch 倒數計數器,構造時設定計數值,當計數值歸零後,所有阻塞線程恢復執行;其內部實現了AQS框架 CyclicBarrier 循環柵欄,構造時設定等待線程數,當所有線程都到達柵欄後,柵欄放行,然後

原创 6.1 JUC — 非阻塞同步機制CAS

CAS的作用 在多線程併發下,可以通過加鎖來保證線程安全性,但多個線程同時請求鎖,而線程的掛起和恢復會有很大的開銷。一些細粒度的操作,例如同步容器,操作往往只有很少代碼量,如果存在鎖並且線程激烈地競爭,調度的代價很大。在硬件的支持下,出現

原创 記一次myBaits踩坑

在進行業務開發時,遇見一個需求,從前端返回一個list的ids,要按照ids去從數據庫中查找,然後將它的列屬性-優先級更新爲該id在ids的位置。 例如:ids=[3, 6 ,2],則將id爲3、6、2的條目的優先級列設置成對應位置的1、

原创 6.2 JUC — 鎖 Locks

鎖是用於控制多線程訪問共享資源的工具。通常,鎖提供對共享資源的獨佔訪問:一次只有一個線程可以獲取鎖,對共享資源的所有訪問都需要首先獲取鎖。但是,一些鎖可以允許同時訪問共享資源,例如讀寫鎖ReadWriteLock。 鎖的分類 a.悲觀鎖與

原创 5. Unsafe類

     Unsafe類使Java擁有了像C語言的指針一樣操作內存空間的能力,同時也帶來了指針的問題。可以通過類似 C語言裏面的 memcpy 和 memset等函數直接操作對應內存地址的數據。       Unsafe是單例模式,通過調

原创 4. 線程Thread

線程狀態 java中線程的狀態分爲6種: 初始化(New):當線程完成對象創建後,即new Thread(...),還沒有調用start()方法之前,線程處於此狀態。 運行態(Runnable):調用start方法,正在jvm中運行,但是

原创 spring mvc 各種註解

@RequestMapping 建立請求URL和處理請求方法之間的對應關係,可以放在類上或者方法上。 @RequestMapping("/account") //表示請求的一級目錄 public cl

原创 1. 三大概念

原子性 一個操作或者多個操作 要麼全部執行並且執行的過程不會被任何因素打斷,要麼就都不執行。 類似於數據庫的事務的原子性,比如在銀行轉賬時,兩個賬戶進行讀寫操作,若不具有原子性則可能導致意想不到的結果。 再舉個例子,一個簡單的賦值語句 i

原创 spring AOP總結

通配符 *  匹配任意數量字符      //任意返回值,任意名稱,任意參數的公共方法 execution(public * *(..)) //匹配com.zejian.dao包及其子包中所有類中的所有方法 within(com.zej

原创 6.3 JUC — 阻塞同步機制AQS

AbstractQueuedSynchronizer(AQS),即隊列同步器。它是構建鎖或者其他同步組件的基礎框架(如ReentrantLock、ReentrantReadWriteLock、Semaphore等),它是JUC併發包中的核

原创 myBatis + log4j簡單實例

代碼段 //根據xml創建SqlSessionFactory對象 String resource = "mybatisConfig.xml"; InputStream inputStream = Resources.getResourc