####指標(biāo):理解synchronized的含義、明確synchronized關(guān)鍵字修飾普通方法、靜態(tài)方法和代碼塊時(shí)鎖對(duì)象的差異箫爷。
```
有如下一個(gè)類A
class A {
? ? public void a() {
? ? }
? ? public synchronized void b() {
? ? }
}
然后創(chuàng)建兩個(gè)對(duì)象
A a1 = new A();
A a2 = new A();
然后在兩個(gè)線程中并發(fā)訪問如下代碼:
Thread1? ? ? ? ? ? ? ? ? ? ? Thread2
a1.a();? ? ? ? ? ? ? ? ? ? ? a2.a();
請(qǐng)問二者能否構(gòu)成線程同步舌稀?
如果A的定義是下面這種呢?
class A {
? ? public static synchronized void a() {
? ? }
? ? public static synchronized void b() {
? ? }
}
```
###回答:
synchronized是java的一個(gè)關(guān)鍵字剖效,保持線程同步的一種機(jī)制嫉入,同步鎖的一種焰盗,在同一個(gè)時(shí)間段里只有一個(gè)線程能對(duì)一個(gè)資源進(jìn)行操作.
修飾方法時(shí),是遵循一個(gè)對(duì)象一個(gè)鎖的規(guī)律咒林,每個(gè)對(duì)象都有一個(gè)內(nèi)部鎖熬拒。
1、修飾普通方法垫竞,不構(gòu)成同步澎粟,兩個(gè)對(duì)象分別對(duì)應(yīng)兩個(gè)不同的鎖,線程a1對(duì)代碼塊進(jìn)行讀寫的時(shí)候欢瞪,不能保證線程同步活烙。
2、修飾靜態(tài)方法遣鼓,構(gòu)成同步啸盏,static關(guān)鍵字對(duì)該代碼塊形成了同一個(gè)鎖,它的鎖是對(duì)象鎖譬正,a1在對(duì)該類對(duì)象進(jìn)行操作的時(shí)候宫补,會(huì)形成阻塞。