文章地址: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,若是其中一個線程先得到鎖,另外一個線程不得執行.
方法二和方法三的叫類鎖
公衆號: