Synchronized的作用主要
(1)確保線程互斥的訪問(wèn)同步代碼
(2)保證共享變量的修改能夠及時(shí)可見(jiàn)
(3)有效解決重排序問(wèn)題关贵。
Synchronized的基本使用
- 修飾普通方法
當(dāng)synchronized關(guān)鍵字修飾一個(gè)方法的時(shí)候零蓉,該方法叫做同步方法玉凯。Java中的每個(gè)對(duì)象都有一個(gè)鎖(lock),或者叫做監(jiān)視器(monitor),當(dāng)一個(gè)線程訪問(wèn)某個(gè)對(duì)象的synchronized方法時(shí),將該對(duì)象上鎖喘先,其他任何線程都無(wú)法再去訪問(wèn)該對(duì)象的synchronized方法了(這里是指所有的同步方法,而不僅僅是同一個(gè)方法)廷粒,直到之前的那個(gè)線程執(zhí)行方法完畢后(或者是拋出了異常)窘拯,才將該對(duì)象的鎖釋放掉,其他線程才有可能再去訪問(wèn)該對(duì)象的synchronized方法 - 修飾靜態(tài)方法
如果某個(gè)synchronized方法是static的坝茎,那么當(dāng)線程訪問(wèn)該方法時(shí)涤姊,它鎖的并不是synchronized方法所在的對(duì)象,而是synchronized方法所在的類所對(duì)應(yīng)的Class對(duì)象景东。Java中砂轻,無(wú)論一個(gè)類有多少個(gè)對(duì)象,這些對(duì)象會(huì)對(duì)應(yīng)唯一一個(gè)Class對(duì)象斤吐,因此當(dāng)線程分別訪問(wèn)同一個(gè)類的兩個(gè)對(duì)象的兩個(gè)static搔涝,synchronized方法時(shí),它們的執(zhí)行順序也是順序的和措,也就是說(shuō)一個(gè)線程先去執(zhí)行方法庄呈,執(zhí)行完畢后另一個(gè)線程才開(kāi)始。 - 修飾代碼塊
synchronized方法是一種粗粒度的并發(fā)控制派阱,某一時(shí)刻诬留,只能有一個(gè)線程執(zhí)行該synchronized方法;synchronized塊則是一種細(xì)粒度的并發(fā)控制,只會(huì)將塊中的代碼同步文兑,位于方法內(nèi)盒刚、synchronized塊之外的其他代碼是可以被多個(gè)線程同時(shí)訪問(wèn)到的
Synchronized 原理
package thread.pool;
public class SynchronizedDemo {
public void method() {
synchronized (this) {
System.out.println("Method 1 start");
}
}
}
結(jié)果:
代碼塊加鎖就是在方法中定義monitor對(duì)象,通過(guò)對(duì)monitor值判斷來(lái)得出是否具有操作權(quán)限绿贞。
package thread.pool;
public class SynchronizedDemo {
public synchronized void method() {
System.out.println("Method 1 start");
}
}
結(jié)果:
在常量池中加入ACC_SYNCHRONIZED標(biāo)示符因块,判斷標(biāo)識(shí)符是否存在來(lái)得出是否具有操作權(quán)限。