主要講synchronize兩部分問題 1.可重入鎖, 2.synchronize區域的合理使用。
JVM中的區域主要分為五部分
線程私有 虛擬機棧、本地方法棧、程序計數器
線程共享: java堆、方法區
所謂的線程安全針對的就是線程共享區域,從此處我們得到一個結論:無狀態的類是線程安全的,因為不存在線程共享一說。
1.可重入鎖: java中對於每個鎖都關聯一個計數值和對應的線程,初始計數值為0, 線程獲取此鎖,計數值+1, 線程離開此鎖計數值-1.當計數值為0,其它線程才可以獲取此鎖。
package com.ThreadSafe; /** * 可重入鎖 * 如果鎖不可重入, 那么下面代碼會產生死鎖 * 最終鎖住的對象都是子節點對象 */ public class reEntrantLock { public synchronized void doSomething() { System.out.println(this); } public static void main(String... args) { new reSonLock().doSomething(); } } class reSonLock extends reEntrantLock { public synchronized void doSomething() { System.out.println(this); super.doSomething(); } }
2. synchronize 此關鍵字使用的時候, 應該把同步 區域盡可能的縮小,主要針對那些可變的狀態變量。