(一)靜態變量:線程非安全php
一、靜態變量:使用static關鍵字定義的變量。static能夠修飾變量和方法,也有static靜態代碼塊。被static修飾的成員變量和成員方法獨立於該類的任何對象。也就是說,它不依賴類特定的實例,被類的全部實例共享。只要這個類被加載,Java虛擬機就能根據類名在運行時數據區的方法區內定找到他們。所以,static對象能夠在它的任何對象建立以前訪問,無需引用任何對象。html
用public修飾的static成員變量和成員方法本質是全局變量和全局方法,當聲明它的類的對象時,不生成static變量的副本,而是類的全部實例共享同一個static變量。安全
二、靜態變量使用的場景:多線程
(1)對象間共享值時app
(2)方便訪問變量時ide
三、靜態方法使用注意事項:ui
(1)不能在靜態方法內使用非靜態變量,即不能直接訪問所屬類的實例變量;this
(2)不能在靜態方法內直接調用非靜態方法;url
(3)靜態方法中不能使用this和super關鍵字;線程
四、驗證靜態變量的線程安全性:
(1)從程序執行的圖中咱們能夠看出,執行結果中有錯誤數據,證實了靜態變量是存在資源衝突問題的。
(2)程序運行結果圖:
五、結論:靜態變量也稱爲類變量,屬於類對象全部,位於方法區,爲全部對象共享,共享一分內存,一旦值被修改,則其餘對象均對修改可見,故線程非安全。
(二)實例變量:單例時線程非安全,非單例時線程安全
一、實例變量:實例變量屬於類對象的,也就是說,屬於對象實例私有,在虛擬機的堆中分配。
二、驗證明例變量的線程安全性:
(1)從程序截圖中,咱們能夠看到,當爲單例模式時,會產生資源衝突,當非單例模式時,則不會產生線程衝突。
(2)程序運行結果圖:
三、結論:實例變量是實例對象私有的,系統只存在一個實例對象,則在多線程環境下,若是值改變後,則其它對象都可見,故線程非安全;若是每一個線程都在不一樣的實例對象中執行,
則對象與對象間的修改互不影響,故線程安全。
(三)局部變量:線程安全
一、局部變量:定義在方法內部的變量。
二、驗證局部變量的安全性:
(1)從程序截圖中能夠看出,局部變量在多線程下沒有產生資源衝突的問題
(2)程序運行結果圖:
棧的內存空間中,線程間不共享,故不存在線程安全問題。
(四)靜態方法的線程安全性
一、靜態方法中若是沒有使用靜態變量,則沒有線程安全的問題;
靜態方法內的變量,每一個線程調用時,都會新建立一份,不會公用一個存儲單元,故不存在線程衝突的問題。