一 java內存結構
Heap(堆)實例分配的地方通過Xms與Xmx來設置
MethodArea(方法區域)類的信息及靜態變量 對應是Permanet Generation 通過XXPermSize來設置
JavaStack(java的棧)虛擬機只會直接對Javastack執行兩種操作以幀為單位的壓棧或出棧通過Xss來設置 若不夠會拋出StackOverflowError
ProgramCounter(程序計數器)每一個線程都有它自己的PC寄存器也是該線程啟動時創建的PC寄存器的內容總是指向下一條將被執行指令的餓地址這裡的地址可以是一個本地指針也可以是在方法區中相對應於該方法起始指令的偏移量
Nativemethodstack(本地方法棧)保存native方法進入區域的地址
當中Heap和MethodArea是被所有線程的共享使用的
而JavastackProgramcounter和Nativemethodstack是以線程為粒度的每個線程獨自擁有自己的部分
二 內存模型
由以上可以知道java內存分為main memory和線程的Working Memory就會涉及到這兩種內存數據同步以及多個線程操作時數據一致性和可見性的問題這就不可避免要加鎖了在java中可采用如下的形式
synchronized關鍵字或使用ncurrentlocks中的鎖
volatile關鍵字 Volatile表示的是線程每次操作都是在主內存中進行 這只能保證其可見性 而不能保證其的原子性 要有原子性還得加鎖
final變量(基本類型類類型還是可以改值的)
三 如何保證線程安全
每個線程只操作自有的數據 這個可能性要小
設計的類無數據成員 也就沒有共享變量 要有可用是 final或volatile
在操作共享變量時同步
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26489.html