static、volatile、synchronize

原子性(排他性):不論是多核還是單核,具有原子性的量,同一時刻只能有一個線程來對它進行操作!
可見性:多個線程對同一份數據操作,thread1改變了某個變量的值,要保證thread2能看見這個值被改變了。
static
靜態的,在程序執行的時候,就已經加載或執行。
修飾方法、變量、代碼塊。
靜態方法不能引用非靜態的變量和方法。因為非靜態的方法和變量只有在具體的實例存在才會相應的加載。
同時被static修飾的成員變量和成員方法是獨立于該類的,它不依賴于某個特定的實例變量,也就是說它被該類的所有實例共享。所有實例的引用都指向同一個地方,任何一個實例對其的修改都會導致其他實例的變化。每個實例指向的都是同一個堆地址區域,修改的都是同一塊內存。
保證了變量在該類所有的實例中的唯一性。
static為什么不能保證線程安全???
每個線程運行時都有一個線程棧,線程棧保存了線程運行時候變量值信息。當線程訪問某一個對象時候值的時候,首先通過對象的引用找到對應在堆內存的變量的值,然后把堆內存變量的具體值load到線程本地內存中,建立一個變量副本,之后線程就不再和對象在堆內存變量值有任何關系,而是直接修改副本變量的值,在修改完之后的某一個時刻(線程退出之前),自動把線程變量副本的值回寫到對象在堆中變量。這樣在堆中的對象的值就產生變化了。
摘自:http://www.cnblogs.com/shangxiaofei/p/5564340.html
這樣就會導致多線程帶來的問題,多個線程都從主內存私有拷貝變量到自己的工作區,a線程改變了var1的值,進行+1操作,還沒寫回到主內存。b線程這時看到自己的工作區中的var1值沒變。這就是多線程帶來的問題。
那么如何保證變量在多線程中的安全?(有人說可以聲明為final類型,但是這樣就是常量了。)
volatile
volatile,聲明這個字段易變(可能被多個線程使用),Java內存模型負責各個線程的工作區與主存區的該字段的值保持同步,即一致性。
volatile禁止編譯器對成員變量進行優化,被volatile聲明的變量,多個線程在操作的時候,每改變其值的時候,jvm都強行要求其立刻寫回主內存。每次使用其值的時候,都要求其從主內存重新拷貝。這樣就保證了操作的可見性,但是并不能保證操作的原子性,多個線程仍然可以對其進行同時操作。在某種情況下,volatile還是不能保證線程的安全。
那么如何保證多線程的安全?
synchronize
建議看此篇
http://www.cnblogs.com/GnagWang/archive/2011/02/27/1966606.html
區別
static只是聲明變量在主存上的唯一性,不能保證工作區與主存區變量值的一致性;除非變量的值是不可變的,即再加上final的修飾符,否則static聲明的變量,不是線程安全的。
volatile同步機制不同于synchronized,前者是內存同步,后者不僅包含內存同步(一致性),且保證線程互斥(互斥性)。
synchronized:其實就像加了鎖一樣,只能等待這個線程操作完變量,并且把變量值同步到堆(主內存后),釋放鎖;然后其他線程才可以讀寫。
ReentrantLock:ReentrantLock多了鎖投票,定時鎖等候,中斷鎖等候;synchronized鎖不能被打斷;競爭激烈的時候,使用此鎖,效率更高些。

轉載于:https://www.cnblogs.com/xiujuan/p/7610107.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/391257.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/391257.shtml
英文地址,請注明出處:http://en.pswp.cn/news/391257.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

tensorflow基本教程

轉載自 http://tensornews.cn/ 轉載于:https://www.cnblogs.com/Chris-01/p/11523316.html

1.10-linux三劍客之sed命令詳解及用法

內容:1.sed命令介紹2.語法格式,常用功能查詢 增加 替換 批量修改文件名第1章 sed是什么字符流編輯器 Stream Editor第2章 sed功能與版本處理出文本文件,日志,配置文件等增加,刪除,修改,查詢sed --versionsed -i 修改文件內容第3章 語法格式3.1 語法格式sed [選項] [sed指令…

python pca主成分_超越“經典” PCA:功能主成分分析(FPCA)應用于使用Python的時間序列...

python pca主成分FPCA is traditionally implemented with R but the “FDASRSF” package from J. Derek Tucker will achieve similar (and even greater) results in Python.FPCA傳統上是使用R實現的,但是J. Derek Tucker的“ FDASRSF ”軟件包將在Python中獲得相…

blender視圖縮放_如何使用主視圖類型縮放Elm視圖

blender視圖縮放A concept to help Elm Views scale as applications grow larger and more complicated.當應用程序變得更大和更復雜時,可幫助Elm Views擴展的概念。 In Elm, there are a lot of great ways to scale the Model, and update, but there is more c…

初探Golang(2)-常量和命名規范

1 命名規范 1.1 Go是一門區分大小寫的語言。 命名規則涉及變量、常量、全局函數、結構、接口、方法等的命名。 Go語言從語法層面進行了以下限定:任何需要對外暴露的名字必須以大寫字母開頭,不需要對外暴露的則應該以小寫字母開頭。 當命名&#xff08…

789

789 轉載于:https://www.cnblogs.com/Forever77/p/11524161.html

sql的split()函數

ALTER function [dbo].[StrToList_Test](Str varchar(max), fg NVARCHAR(200)) returns table table(value nvarchar(max) ) as begindeclare tempStr nvarchar(max),len INT LEN(fg); --去除前后分割符 while substring(Str,1,len)fg beginset Strsubstring(Str,len1,len(S…

大數據平臺構建_如何像產品一樣構建數據平臺

大數據平臺構建重點 (Top highlight)Over the past few years, many companies have embraced data platforms as an effective way to aggregate, handle, and utilize data at scale. Despite the data platform’s rising popularity, however, little literature exists on…

初探Golang(3)-數據類型

Go語言擁有兩大數據類型,基本數據類型和復合數據類型。 1. 數值類型 ##有符號整數 int8(-128 -> 127) int16(-32768 -> 32767) int32(-2,147,483,648 -> 2,147,483,647) int64&#x…

freecodecamp_freeCodeCamp的服務器到底發生了什么?

freecodecampUpdate at 17:00 California time: We have now fixed most of the problems. Were still working on a few known issues, but /learn is now fully operational.加利福尼亞時間17:00更新 :我們現在解決了大多數問題。 我們仍在處理一些已知問題&#…

為什么Linux下的環境變量要用大寫而不是小寫

境變量的名稱通常用大寫字母來定義。實際上用小寫字母來定義環境變量也不會報錯,只是習慣上都是用大寫字母來表示的。 首先說明一下,在Windows下是不區分大小寫的,所以在Windows下怎么寫都能獲取到值。 而Linux下不同,區分大小寫&…

python:連接Oracle數據庫后控制臺打印中文為??

打印查詢結果,中文顯示為了??? [(72H FCR, 2.0), (?????, 8.0)] E:\Python35\Lib\site-packages中新增文件: sitecustomize.py import os os.environ[NLS_LANG] SIMPLIFIED CHINESE_CHINA.UTF8 轉載于:https://w…

時間序列預測 時間因果建模_時間序列建模以預測投資基金的回報

時間序列預測 時間因果建模Time series analysis, discussed ARIMA, auto ARIMA, auto correlation (ACF), partial auto correlation (PACF), stationarity and differencing.時間序列分析,討論了ARIMA,自動ARIMA,自動相關(ACF),…

初探Golang(4)-map和流程控制語句

1.map map 是引用類型的,如果聲明沒有初始化值,默認是nil。空的切片是可以直接使用的,因為他有對應的底層數組,空的map不能直接使用。需要先make之后才能使用。 //1, 聲明map 默認值是nil var m1 map[key_data_type]value_data_type 聲明 …

網絡傳輸之TCP/IP協議族

我們現實網絡無處不在,我們被龐大的虛擬網絡包圍,但我們卻對它是怎樣把我們的信息傳遞并實現通信的,我們并沒有了解過,那么當我們在瀏覽器中出入一段地址,按下回車這背后都會發生什么? 比如說一般場景下&am…

(58)PHP開發

LAMP0、使用include和require命令來包含外部PHP文件。使用include_once命令,但是include和include_once命令相比的不足就是這兩個命令并不關心請求的文件是否實際存在,如果不存在,PHP解釋器就會直接忽略這個命令并且顯示一個錯誤消息&#xf…

css flexbox模型_如何將Flexbox后備添加到CSS網格

css flexbox模型I shared how to build a calendar with CSS Grid in the previous article. Today, I want to share how to build a Flexbox fallback for the same calendar. 在上一篇文章中,我分享了如何使用CSS Grid構建日歷。 今天,我想分享如何為…

python:封裝連接數據庫方法

config.py # 數據庫測試環境 name *** password ****** host_port_sid 10.**.*.**:1521/bidbuat OracleOperation.py import cx_Oracle import configclass OracleOperation(object):# 執行下面的execute_sql方法時會自動執行該初始化方法進行連接數據庫def __init__(self):…

貝塞爾修正_貝塞爾修正背后的推理:n-1

貝塞爾修正A standard deviation seems like a simple enough concept. It’s a measure of dispersion of data, and is the root of the summed differences between the mean and its data points, divided by the number of data points…minus one to correct for bias.標…

RESET MASTER和RESET SLAVE使用場景和說明【轉】

【前言】在配置主從的時候經常會用到這兩個語句,剛開始的時候還不清楚這兩個語句的使用特性和使用場景。 經過測試整理了以下文檔,希望能對大家有所幫助; 【一】RESET MASTER參數 功能說明:刪除所有的binglog日志文件,…