https://blog.csdn.net/suifeng3051/article/details/52164267java
我的總結:web
- 線程安全:原子性、可見性、有序性
- 線程安全能夠簡單理解爲
- 一個方法或者一個實例能夠在多線程環境中使用而不會出現問題
- 多個線程訪問了相同的資源
- 同一內存區(變量,數組,或對象)、系統(數據庫,web services等)或文件等
- 只有在一或多個線程向這些資源作了寫操做時纔有可能發生,
- 只要資源沒有發生變化,多個線程讀取相同的資源就是安全的
- 咱們沒法知道操做系統什麼時候會在兩個線程之間切換
-
基礎類型的局部變量是線程安全的
- 定義在方法內部的局部變量
-
局部的對象引用就不必定,由於對象存在堆裏面,能夠存在多個引用
-
判斷資源對象是不是線程安全
- 好比:多線程各自建立數據庫鏈接,在鏈接層面是線程安全的
- 可是操做的是數據庫相同的數據,在數據庫層面就不是線程安全的
- 即便一個對象是線程安全的不可變對象,指向這個對象的引用也可能不是線程安全的
- 好比ConcurrentHashMap 是線程安全的,可是使用它 get,再set 也不是線程安全的
Java中實現線程安全的方法數據庫
- 在Java多線程編程當中,提供了多種實現Java線程安全的方式:
- 最簡單的方式,使用Synchronization關鍵字:Java Synchronization介紹
- 使用java.util.concurrent.atomic 包中的原子類,例如 AtomicInteger
- 使用java.util.concurrent.locks 包中的鎖
- 使用線程安全的集合ConcurrentHashMap
- 使用volatile關鍵字,保證變量可見性(直接從內存讀,而不是從線程cache讀)