1.落筆緣由
還是朝花夕拾渔伯,將以前記在筆記本上的筆記記錄下來十嘿,還從網(wǎng)上查了一下資料,查漏補(bǔ)缺慕嚷。
2.synchronized理解
synchronized主要作用是在多線程的同步機(jī)制對(duì)資源進(jìn)行加鎖偶宫,在同一時(shí)刻只能有一個(gè)線程能對(duì)加鎖部分進(jìn)行操作非迹,從而避免多個(gè)線程同時(shí)對(duì)同一個(gè)對(duì)象進(jìn)行操作而引起數(shù)據(jù)混亂的問題。
3.synchronized用法
synchronized有兩種用法读宙,一種是用來修飾方法彻秆,稱之為同步方法;一種是直接對(duì)代碼塊進(jìn)行同步结闸,我們簡稱為同步塊唇兑。
1)同步方法
如下,在TestObject類中對(duì)sayHello方法進(jìn)行同步桦锄,當(dāng)多個(gè)線程同時(shí)調(diào)用TestObject的一個(gè)實(shí)例(注意扎附,多個(gè)線程必須對(duì)同一個(gè)TestObject實(shí)例對(duì)象進(jìn)行操作,否則synchronized是沒有意義的)的sayHello方法的時(shí)候结耀,這個(gè)時(shí)候只能有一個(gè)線程能執(zhí)行sayHello操作留夜,等當(dāng)前的線程執(zhí)行完成后,下一個(gè)線程才能拿到鎖图甜,執(zhí)行sayHello操作碍粥。
同步方法有兩種鎖,一種是對(duì)象鎖黑毅,一種是類鎖嚼摩。同步方法中兩種鎖的區(qū)別主要是對(duì)象鎖沒有被static修飾,而類鎖被static修飾。
(1)對(duì)象鎖
public synchronized void sayHello(String name) {
for (int j = 0; j < 5; j++) {
System.out.println(name+"打招呼"+j+"次");
}
}
(2)類鎖
public static synchronized void sneeze(String name) {
for (int j = 0; j < 5; j++) {
System.out.println(name+"打噴嚏"+j+"次");
}
}
2)同步塊
同步塊的synchronized有兩種鎖枕面,一種稱之為對(duì)象鎖愿卒,另一種是類鎖。
主要區(qū)別是synchronized ()括號(hào)里是this還是一個(gè)類潮秘。如果是this則是對(duì)象鎖琼开,那么他的作用是多個(gè)線程對(duì)同一個(gè)對(duì)象進(jìn)行的操作同步。如果是一個(gè)類枕荞,那么他的作用是多個(gè)線程對(duì)類的所有實(shí)例都進(jìn)行同步柜候。
同步塊與同步方法的區(qū)別是同步方法是使用synchronized修飾方法的,而同步塊是在方法里對(duì)某個(gè)部分的代碼塊進(jìn)行同步买猖。
(1)對(duì)象鎖:
public void burp(String name) {
synchronized (this) {
for (int j = 0; j < 5; j++) {
System.out.println(name+"打嗝"+j+"次");
}
}
}
(2)類鎖:
public void whistle(String name)
{
synchronized (TestObject.class) {
for (int j = 0; j < 5; j++) {
System.out.println(name+"吹口哨"+j+"次");
}
}
}