主要講synchronize兩部分問題 1.可重入鎖, 2.synchronize區域的合理使用。java
JVM中的區域主要分爲五部分安全
線程私有 虛擬機棧、本地方法棧、程序計數器this
線程共享: java堆、方法區spa
所謂的線程安全針對的就是線程共享區域,今後處咱們獲得一個結論:無狀態的類是線程安全的,由於不存在線程共享一說。線程
1.可重入鎖: java中對於每一個鎖都關聯一個計數值和對應的線程,初始計數值爲0, 線程獲取此鎖,計數值+1, 線程離開此鎖計數值-1.當計數值爲0,其它線程才能夠獲取此鎖。code
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 此關鍵字使用的時候, 應該把同步 區域儘量的縮小,主要針對那些可變的狀態變量。對象