併發編程學習筆記二 ------synchronized關鍵字實現同步訪問解決多線程安全問題

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

相關文章
相關標籤/搜索