1.synchronized首先定義爲一個重量鎖(相對於偏向鎖,輕量鎖)java
2.使用場景:修飾普通方法;修飾靜態方法;修飾代碼塊安全
3.修飾普通方法多線程
private int value; /* synchronized 修飾普通方法時,內置鎖就是當前類的實例 */ public synchronized int getNext(){ return value++; }
首先說明下 value++這個操做是非原子性的(即包括從堆中取變量value,而後實現+1,最後寫回堆中,這樣多線程執行纔會有安全性問題)this
而增長該關鍵字之後,進入這個方法時,都須要驗證鎖,即沒有持有當前類實例的不容許進入,從而保證操做的原子性線程
4.修飾靜態方法對象
/* 當synchronized關鍵字修飾靜態方法時,內置鎖是當前的Class字節碼對象 solutionSaveProblemBySynchronized。class */ public static int getProvious(){ return value--; }
這種修飾時,鎖是.class文件,即類的字節碼文件,該文件具備惟一性,從而實現原子操做get
5.修飾代碼塊cmd
public int doSomeThing(){ /* 若是鎖的是一個對象,則持有該對象的均可以進入,若是鎖的是字節碼文件 字節碼文件具備惟一性 this指代當前對象 查看字節碼文件指令: cmd 找到相應的。class文件,而後javap -verbose 字節碼文件名 */ synchronized (this){ } synchronized (solutionSaveProblemBySynchronized.class){ } if(value>0){ return value; } else { return 0; } }
修飾代碼塊的時候,實際上是將要執行的代碼體方式關鍵字的包裹中,能夠說是放在一個方法中,synchronized()接收的是一個對象做爲鎖,去尋找對象的頭部信息中獲取鎖信息,同步
關於對象頭,能夠參考其餘做者博文,我也是去看了下其餘做者的博文進行了解的io
續:1.synchronized屬於可重入鎖
2.valatile與synchronized的區別
1).都可實現變量可見性,從而實現同步
2).valatile對於非原子操做沒法保證一致性,緣由是隻是使變量可見,可是沒有對非原子操做加鎖
3).使用場景 一、狀態標誌量,二、double check