原创 Java 併發ThreadLocal

從ThreadLocal 的名字上可以看到,這是一個線程的局部變量。也就是說,只有當前線程可以訪問。既然是隻有當前線程可以訪問的數據,自然是線程安全的。 實際上,ThreadLocal確實也是Thread的一個屬性: 源碼是這樣的: p

原创 利用二進制解決一些問題

一 0和1 簡單規則: 二、 簡單題目總結: 1 已知數n,檢測其K位(二進制)是否置位(是否爲1) n&(1<<k-1) 如果表達式爲真,則第K位置位1。 說明: 1 左移 k-1位,變爲 第K位爲1,其他的

原创 JDK1.7之下的inern用法

JDK1.7之下的inern用法: String s = new String("1aaa"); s.intern(); String s2 = "1aaa"; System.out.println(s2 == s.inter

原创 模板方法模式

定義一個操作中的算法的骨架,而將一些步驟的實現延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。 其中一開始不能理解的“延遲”一詞,如果延遲實現了,那在沒有實現之前怎麼使用呢?在實際中情況,我們一般是直

原创 工作中的一次SQL優化

先大致看下這個報表SQL: SELECT …… o214015.DATE_POSTED as E214040, o214015.POSTED_BY as E214041, o

原创 java虛擬機對鎖優化所做的努力

1、 鎖偏向 鎖偏向是一種針對加鎖操作的優化手段。 如果一個線程獲得了鎖,那麼鎖就進入偏向模式。當這個線程再次請求鎖時,無須再做任何同步操作。這樣就節省了大量有關鎖申請的操作,從而提高了程序性能。因此,對於幾乎沒有鎖競爭的場合,偏向鎖有比

原创 垃圾收集算法和垃圾收集器

垃圾收集算法 在jvm中常用的垃圾收集算法有三種: 標記清除、 複製算法 、標記壓縮 標記清除算法: 標記清除算法分爲兩個階段:標記和清除。 首先標記出所有需要回收的對象,在標記完成後統一回收所有被標記的對象。 主要有不足有兩

原创 Java 併發編程 鎖與同步器

1、lock Lock 接口是Java併發包中最基礎的一個接口,相應的它定義了一些鎖的基本功能。相比synchronized關鍵字,具有以下特徵: 可以嘗試非阻塞地獲取鎖 可中斷的獲取鎖 定時獲取鎖 Lock

原创 分代垃圾收集器

將堆劃分成不同的代(Generation) 分爲老年代(Old Generation 或者Tenured Generation)和新生代(Young Generation)。 新生代又分爲Eden空間(稱之爲 伊甸園 ,喻意爲對象“出生

原创 垃圾收集器(二)

1、串行回收器 串行回收器使用單線程進行垃圾回收的回收器。每次回收時,串行回收器只有一個工作線程,對於並行能力較弱的計算機來說,串行回收器的專注性和獨佔性往往有更好的性能表現。串行回收器可以在新生代和老年代使用。根據作用於不同的堆空間,分

原创 ConcurrentSkipListMap

在JDK的併發包中,除了常用的哈希表外,還有一種數據結構–跳錶。 跳錶是一種可以用來快速查找的數據結構,有點類似與平衡樹。它們都可以對元素進行快速查找。就查詢性能而言,跳錶的時間複雜度是O(log n) 跳錶的結構圖如下: 最底層呢的鏈

原创 Java 併發 CountLatchDown

一個同步工具,使得當前線程等待,直到其他多個線程完成一系列的操作後,繼續執行。 其中的當前線程也可以是多個線程,這個地方的線程的數量是任意的。 也就是await() 可以在多個線程中調用。 這個方法可以使得當前線程等待,也就是當前線程

原创 Java 併發編程 CAS

1、比較交換 CAS 與鎖相比,使用比較交換會使程序看起來更加複雜一些。但由於其非阻塞性,他對死鎖問題天生免疫,並且,線程間的相互影響也遠遠比基於鎖的方式要小。使用無鎖的方式完全沒有鎖競爭帶來的系統開銷,也沒有線程間頻繁調度帶來的開銷。

原创 Java 併發編程 Fork Join 一

“分而治之”一直是一個非常有效地處理大量數據的方法。著名的MapReduce也是採取了分而治之的思想。 Fork就是分解任務,而Join 在Java線程中是等待意思 ,也就是等待計算結果。在實際應用中如果毫無顧忌地使用fork開啓線程進行

原创 鎖優化的建議

1、減小鎖持有時間 它的核心思想就是不要在不必需要的代碼上加鎖,因爲線程持有的鎖時間過長,相對地,鎖的競爭程度也就越激烈。 看下面的代碼: public synchronized void syncMethod() { o