背景
并發編程是Java語言的重要特性之一,當然也是最難以掌握的內容,撰寫可靠的并發程式是一項不小的挑戰,但是,作為程式員的我們,要變得更有價值,就需要啃一些硬骨頭了,因此,理解并發編程的基礎理論和編程實踐,讓自己變得更值錢吧,

完整PDF檔案,看文末免費獲取
問題一:什么是執行緒安全問題?
執行緒安全問題是指當多個執行緒同時讀寫一個狀態變數,并且沒有任何同步措施時候,導致臟資料或者其他不可預見的結果的問題,Java 中首要的同步策略是使用Synchronized 關鍵字,它提供了可重入的獨占鎖,
問題二:什么是共享變數可見性問題?
要談可見性首先需要介紹下多執行緒處理共享變數時候的 Java 中記憶體模型,

Java 記憶體模型規定了所有的變數都存放在主記憶體中,當執行緒使用變數時候都是把主記憶體里面的變數拷貝到了自己的作業空間或者叫做作業記憶體,

當執行緒操作一個共享變數時候操作流程為:
- · 執行緒首先從主記憶體拷貝共享變數到自己的作業空間
- · 然后對作業空間里的變數進行處理
- · 處理完后更新變數值到主記憶體
那么假如執行緒 A 和 B 同時去處理一個共享變數,會出現什么情況呢?
首先他們都會去走上面的三個流程,假如執行緒 A 拷貝共享變數到了作業記憶體,并且已經對資料進行了更新但是還沒有更新會主記憶體(結果可能目前存放在當前cpu 的暫存器或者高速快取),這時候執行緒 B 拷貝共享變數到了自己的作業記憶體進行處理,處理后,執行緒 A 才把自己的處理結果更更新到主記憶體或者快取,可知執行緒 B 處理的并不是執行緒 A 處理后的結果,也就是說執行緒 A 處理后的變數值對執行緒 B 不可見,這就是共享變數的不可見性問題,
構成共享變數記憶體不可見原因是因為三步流程不是原子性操作,下面知道使用恰當同步就可以解決這個問題,
我們知道 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小助理”即可免費獲取到這份檔案哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/185177.html
標籤:其他
上一篇:攻防世界 Pwn 進階 第一頁

