synchronized的使用方法和做用域

文章地址:https://mp.weixin.qq.com/s?__biz=MzI4NTEzMjc5Mw==&mid=2650554746&idx=1&sn=8e45e741ca9f058dba1f3ebbea0e9f07&chksm=f3f833ecc48fbafa295e355c1cdd52dc4259f161dafdc1703d181a5e9f4f76563c98493bd221&token=2005887224&lang=zh_CN#rd多線程

 

 

 

synchronized是保證多線程同步執行的關鍵字,它的用法有如下幾種this

 

對象鎖spa

public class MyClass{線程

    public synchronized void method1(){3d

        //dosomething對象

    }blog

    public synchronized void method2(){token

        //dosomething同步

    }class

    public void method3(){

        //dosomething before synchronized

        synchronized(this){

            //dosomething 

        }

    }

    public void method4(){

        //dosomething

    }   

}

若是用三個線程分別執行方法一,方法二,方法三,  當一個線程搶先獲取得鎖以後,其餘線程在此刻不能繼續執行,這種鎖叫作對象鎖.鎖住的是整個對象.上面代碼synchronized放在方法前以及代碼塊加(this),這兩種方式.若是還有其餘線程則會執行普通方法以及同步代碼塊前的普通代碼

 

類鎖

public class MyClass{

    public synchronized void method1(){

        //dosomething

    }    

    public static synchronized void method2(){

        //dosomething

    }

    public void method3(){

        synchronized(MyClass.class){

            //dosomething 

        }

    }

}

以上代碼,

狀況1:若是用兩個線程去執行方法1和方法2,兩個線程會獲取各自的鎖各自執行本身的代碼,

狀況2:兩個線程都執行方法2,若是一個線程搶先得到鎖,另外一個線程不得執行

狀況3:兩個線程分別執行方法1和方法3,兩個線程會獲取各自的鎖各自執行本身的代碼,

狀況4,兩個線程都執行方法3,若是其中一個線程先得到鎖另外一個線程不得執行

狀況5,兩個線程分別執行方法2和方法3,若是其中一個線程先得到鎖,另外一個線程不得執行.

 

方法二和方法三的叫類鎖

 

公衆號:

 

相關文章
相關標籤/搜索