背景
併發編程是Java語言的重要特性之一,固然也是最難以掌握的內容。編寫可靠的併發程序是一項不小的挑戰。可是,做爲程序員的咱們,要變得更有價值,就須要啃一些硬骨頭了。所以,理解併發編程的基礎理論和編程實踐,讓本身變得更值錢吧。程序員
完整PDF文檔,看文末免費獲取編程
問題一:什麼是線程安全問題?緩存
線程安全問題是指當多個線程同時讀寫一個狀態變量,而且沒有任何同步措施時候,致使髒數據或者其餘不可預見的結果的問題。Java 中首要的同步策略是使用Synchronized 關鍵字,它提供了可重入的獨佔鎖。安全
問題二:什麼是共享變量可見性問題?多線程
要談可見性首先須要介紹下多線程處理共享變量時候的 Java 中內存模型。併發
Java 內存模型規定了全部的變量都存放在主內存中,當線程使用變量時候都是把主內存裏面的變量拷貝到了本身的工做空間或者叫作工做內存。高併發
當線程操做一個共享變量時候操做流程爲:spa
- · 線程首先從主內存拷貝共享變量到本身的工做空間
- · 而後對工做空間裏的變量進行處理
- · 處理完後更新變量值到主內存
那麼假如線程 A 和 B 同時去處理一個共享變量,會出現什麼狀況呢?線程
首先他們都會去走上面的三個流程,假如線程 A 拷貝共享變量到了工做內存,而且已經對數據進行了更新可是尚未更新會主內存(結果可能目前存放在當前cpu 的寄存器或者高速緩存),這時候線程 B 拷貝共享變量到了本身的工做內存進行處理,處理後,線程 A 才把本身的處理結果更更新到主內存或者緩存,可知線程 B 處理的並非線程 A 處理後的結果,也就是說線程 A 處理後的變量值對線程 B 不可見,這就是共享變量的不可見性問題。code
構成共享變量內存不可見緣由是由於三步流程不是原子性操做,下面知道使用恰當同步就能夠解決這個問題。
咱們知道 ArrayList 是線程不安全的,由於他的讀寫方法沒有同步策略,會致使髒數據和不可預期的結果,下面咱們就一一講解如何解決。
這是線程不安全的
public class ArrayList<E> { public E get(int index) { rangeCheck(index); return elementData(index); } public E set(int index, E element) { rangeCheck(index); E oldValue = elementData(index); elementData[index] = element; return oldValue; } }
正文字數有限,只能給你們展現文檔圖片了;文末有完整PDF領取方式
部分併發編程知識導圖,須要完整的能夠看文末
因爲文章字數限制,這裏只能展現部分文檔;我這邊整理了一份完整的PDF,有須要的朋友能夠一鍵三連後;加我「VX小助理」便可免費獲取到這份文檔哦!