JAVA中一般咱們會使用static域變量來在內存中緩存數據或長駐內存數據,衆所周知
,static是類的全部實例所共享.java
考慮一個問題,假如在多線程狀況下,共享數據確定會有危險的,數據庫
例如使用SimpleDateFormat工具的一個變量時,爲方便做爲util寫爲了static,後來緩存
在幾W條數據中會出現一個奇怪的日期,這就是在多線程下會出現問題致使的數據衝突,服務器
通常這種能私有不共享的數據最好爲一個實例一份拷貝,不要作爲static
若非要作,就對象同步鎖,使之單線程。
多線程
如今考慮的問題是,在進程間,static是否仍是共享的?答案是否認的
其實道理很簡單,就是咱們在執行一個java程序的main方法是,是開啓了一個進程來啓動jvm執行該方法,執行完後進程結束,
你再次執行又開啓一個進程,因此static變量沒有共享;至關於開啓一個進程來啓動jvm,因此這裏你的static變量是在線程間經過class對象來共享的,jvm
而jvm一直開啓,因此其裝載的class對象也沒有發生變化,固然static變量可以共享了。
但若是你關閉了服務器,結束該進程,則static不能留到下次啓動服務器時還共享了,
這就至關於上面的運用普通java程序的main()方法同樣。工具
那咱們怎樣在java下做到進程間的數據共享了,spa
一是能夠把一些信息持久化,如保存到數據庫、文件中;
另外一種就是把對象序列化,它也能夠作到在進程間的傳遞,如rmi、corba、jms都能在進程級別
.net
下共享可序列化的對象,但又一點要注意就是類中的static變量不能被序列化保存。線程