java多執行緒學習筆記2---理解原子性和可見性
1.原子性
原子,從字面意思理解就是構成物質的基本單位,那麼它就是不可分的,對於不能分割的操作就是原子操作,比如a=0,這個操作就是不能被分開的,把這種原子操作就稱為原子性,原子操作在同一時刻是不能被多個執行緒同時訪問的,所以不存線上程安全問題。然而還有很多操作都是可分的,就是非原子操作,就會存線上程安全問題,比如c=a+b;此操作就不屬於原子操作,為了保證資料的安全性,就要進行執行緒同步。
2.可見性
可見性是相對於多個執行緒之間的,一個執行緒的操作,另外的執行緒是可見的,在java中使用volatile保證變數在多個執行緒之間是可見的,通過使用volatile關鍵字強制的從公共記憶體中讀取變數的值,雖然變數具有可見性,但是對變數的操作不是原子操作,在併發的環境下還是會出現錯誤。所以volatile只保證可見性不保證原子性,而synchronized即保證原子性又保證可見性。
相關推薦
java多執行緒學習筆記2---理解原子性和可見性
1.原子性 原子,從字面意思理解就是構成物質的基本單位,那麼它就是不可分的,對於不能分割的操作就是原子操作,比如a=0,這個操作就是不能被分開的,把這種原子操作就稱為原子性,原子操作在同一時刻是不能被多個執行緒同時訪問的,所以不存線上程安全問題。然而還有很多操作都是可分的,就是非原子操作,就會存
Java多執行緒學習筆記2
本文是我學習Java多執行緒以及高併發知識的第一本書的學習筆記, 書名是<<Java多執行緒程式設計核心技術>>,作者是大佬企業高階專案經理 高洪巖前輩,在此向他致敬。我將配合開發文件以及本書和其他的部落格 奉獻著的文章來學習,同時做一些簡單的總結。有
Java多執行緒學習筆記(六) synchronized(this)同步語句塊
synchronized (this)同步語句塊 1. 一半非同步,一半同步 1.1 Task 1.2 ThreadA 1.3 ThreadB 1.4 Test 1.5 執行結果 2. synchronize
Java多執行緒學習筆記(五) 使用Condition實現等待/通知
使用Condition實現等待/通知 1. 使用Condition 1.1 MyService 1.2 ThreadA 1.3 Test 1.4 執行結果 1.5 方法對比 2. 使用多個Condition實
Java多執行緒學習筆記(四) 使用ReentrantLock實現同步
1. 測試1 1.1 MyService import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class MyService { pr
Java多執行緒學習筆記(三) wait/notify
1.wait() wait()的作用是使當前執行程式碼的執行緒進行等待, 知道接到通知(notify)或者中斷為止 wait()是Object類的方法 當執行緒處於wait,呼叫interrupt()會出現InterruptedException 在呼叫wait
Java多執行緒學習筆記(二) synchronized同步方法-防止髒讀
1. 髒讀 在給一個物件賦值的時候進行了同步, 但是在取值的時候可能出現意外,此值已經被其他執行緒修改了,這種情況就是髒讀 1.1 PublicVar類 public class PublicVar { public String userName = "wang don
Java多執行緒學習筆記(一) synchronized同步方法
synchronized同步方法 1.提出問題-例項變數非執行緒安全 1.1 何為非執行緒安全? 1.2 舉例 1.2.1 有私有變數的類HasPrivateNum (供多執行緒們去呼叫) 1.2.2 執行緒A
Java多執行緒學習筆記22之增補拾遺
詳細程式碼見:github程式碼地址 第七章 本章內容: 1. 執行緒組的使用 2. 如何切換執行緒的狀態 3. SimpleDateFormat類與多執行緒的解決方案 4. 如何處理執行緒的異常 執行緒的狀態 執行緒物件在不同的執行時期有不同的狀態
Java多執行緒學習筆記21之單例模式與多執行緒
詳細程式碼見:github程式碼地址 第六章 單例模式與多執行緒 前言: 我之前已經開設了23個設計模式這個專欄,介紹了很多的Java設計模式,其中一些模式對於絕 大多數程式語言設計思想都是類似的,需要了解單例模式的可以去看看。 我們在實際開發中經常用到單例模式,但
Java多執行緒學習筆記20之定時器Timer
詳細程式碼見:github程式碼地址 本節內容: 定時器Timer的使用及分析 1) 如何實現指定時間執行任務 2) 如何實現按指定週期執行任務 第五章 定時器Timer 定時/計劃
Java多執行緒學習筆記19之Lock的使用
詳細程式碼見:github程式碼地址 本節內容: ReentrantLock 方法講解及ReentrantReadWriteLock讀寫鎖詳解 5)awaitUninterruptibly() 6) awaitUntil(Date deadline
Java多執行緒學習筆記18之Lock的使用
詳細程式碼見:github程式碼地址 本節內容: 公平鎖和非公平鎖以及ReentrantLock常用方法的使用 1) 公平鎖和非公平鎖 2) getHoldCount()、getQueueLength()、getWait
Java多執行緒學習筆記17之Lock的使用
詳細程式碼見:github程式碼地址 本節內容: 1) Lock/ReentrantLock的newCondition()方法及Condition類/await、signal方法文件翻譯 2) Condition實現等待/通知使用(錯誤示例及正
Java多執行緒學習筆記16之Lock的使用
詳細程式碼見:github程式碼地址 本節內容: 1) Lock介面/ReentrantLock類/lock()/unlock()方法文件翻譯 翻譯中包含了此重入鎖與synchronized方法及語句塊之間區別及優缺點
Java多執行緒學習筆記15之執行緒間通訊
詳細程式碼見:github程式碼地址 本節內容: 1)ThreadLocal類的使用 JDK文件及方法翻譯 InheritableThreadLocal的使用 5.
Java多執行緒學習筆記14之執行緒間通訊
詳細程式碼見:github程式碼地址 本節內容: 1) 實戰 等待/通知之交叉備份 2) 方法join的使用(Jdk文件翻譯及原始碼解析) join()及join(long)的使用和實現原理 &nbs
Java多執行緒學習筆記13之執行緒間通訊
詳細程式碼見:github程式碼地址 本節內容: 1) 生產者消費者模型 多個生產者和多個消費者: 操作值假死及解決 多個生產者和多個消費者: 操作棧假死及解決 2) 通過管
Java多執行緒程式設計筆記2:synchronized同步方法
非執行緒安全會在多個執行緒對同一個物件中的例項變數進行併發訪問時發生,產生的結果就是髒讀,也就是取到的資料是被更改過的。執行緒安全就是獲得的例項變數的值是經過同步處理的。 方法內的變數是執行緒安全的 方法內的變數是執行緒安全的。非執行緒安全的問題存在於例項變數中,如果是方法內部的私有變數,不存在非執行緒安
Java多執行緒學習筆記(四)
1、原子性:操作不能被打斷,要麼成功要麼失敗。i++ 不是原子操作。 2、可見性:一個執行緒修改了資料,其他執行緒立刻可見。 3、順序性: 4、volatile 保證程式的可見性,和順序性。不能保證對複合操作(如i++)的原子性。 javap -v xxx.class