2 synchronized同步方法

2021-09-02 07:03:36 字數 3978 閱讀 4488

package thread;

public class haselfprivatenum else

system.out.println(username + " num = " +num);

}

package thread;

public class threada extends thread

@override

public void run() catch (interruptedexception e) }}

package thread;

public class threadb extends thread

@override

public void run() catch (interruptedexception e) }}

package thread;

public class run

}

 結果展示

a set over

b set over

b num = 200

a num = 200

 新增乙個sycnhroized()同步方法

package thread;

public class haselfprivatenum else

system.out.println(username + " num = " +num);

}

}

 主方法

package thread;

public class run

}

結果展示:

b set over

b num = 200

a set over

a num = 100

關鍵字synchronized取得的鎖都是物件鎖,而不是把一小段**方法當做鎖,所以執行緒先執行那個帶synchronized關鍵字的方法,就先獲得哪乙個物件鎖,由於new 了兩個例項物件,所以有兩個鎖。只有共享資源的讀寫訪問才需要同步化。aynchronized是非同步鎖。

1.5 髒讀,synchronized可重入鎖,異常執行緒鎖自動釋放,同步不具有繼承性

發生髒讀的情況,就是取值時,例項變數已經被其他執行緒修改了,加上synchronized方法就可以解決.就是當第一次呼叫物件鎖時,在其內部在次呼叫,是可以再次獲取鎖的,雖然第一次的鎖沒有解開。不然會造成死鎖問題

1.6同步**塊

同步**塊,當乙個執行緒正在訪問乙個object中的同步**塊時候,另外乙個執行緒可以訪問object中非同步的**塊,可以一半非同步,一半同步·,當執行緒訪問乙個object同步**塊時,將停止訪問這個object類中的另外乙個同步**塊

package threadmaintest;

public class objectservice catch (interruptedexception e)

system.out.println("a end time is " + system.currenttimemillis());

} }public void servicemethodb()

}

package threadmaintest;

import org.omg.portableinterceptor.objectreferencetemplateseqholder;

public class threada extends thread

@override

public void run()

package threadmaintest;

import org.omg.portableinterceptor.objectreferencetemplateseqholder;

public class threadb extends thread

@override

public void run()

}package threadmaintest;

public class run2

}

執行結果:

a start time is 1543307979305

a end time is 1543307981313

b start time is 1543307981313

b end time is 1543307981313

注:當多個執行緒呼叫同乙個物件中的synchroinzed同步方法或synchroized(this)同步**塊的時,呼叫的效果是安順序執行,也就是同步的,阻塞的。

1.7 靜態同步synchronized

當synchronized加到static方法上,是給class類上鎖,加到非static方法上,是給物件上鎖。string常量池對synchronized的影響。

package threadmaintest;

public class objectservice catch (interruptedexception e)

}} }}

package threadmaintest;

import org.omg.portableinterceptor.objectreferencetemplateseqholder;

public class threada extends thread

@override

public void run()

}package threadmaintest;

import org.omg.portableinterceptor.objectreferencetemplateseqholder;

public class threadb extends thread

@override

public void run()

}package threadmaintest;

public class run2

}

 結果展示aa

aaaa

aaaa

a因為兩個執行緒都是裡面的輸入字元都是aa,所以會導致,兩個執行緒拿到的鎖都是相同的,所以會造成b阻塞.這是string常量池引起的,這種情況,可以把變數改為object型別,這樣就不是乙個鎖了,因為new objectr()不在快取裡面。所以第二次會new 乙個新的物件。

1.8 死鎖就是雙方互相持有對方鎖的情況,比如a執行需要用到b物件,但是b執行也需要用到a物件。同時需要,則會造成死鎖,切記,死鎖和死迴圈是兩種不同的情況,死迴圈是不斷地重複,死鎖是等待對方釋放資源。

2. volatile關鍵字

volatile變數增加了例項變數在多個執行緒的可見性。但volatile關鍵字最致命的是不支援原子性,volatile只能修飾變數,synchronized可以保證原子性,也可以間接保證可見性,因為它會將私有記憶體和公共記憶體中的資料做同步。

package thread;

public class haselfprivatenum extends thread

system.out.println("num = " + num);

}package thread;

public class run

for (int i = 0; i < 100; i++)

}}結果展示:

num = 3600

num = 3900

num = 4000

num = 4100

num = 4200

num = 4300

num = 4400

num = 4500

num = 4600

 增加了執行緒之間的可見性,但是不具備同步性!關鍵字valitile保證了執行緒每次從共享記憶體中讀取資料,而不是從私有記憶體中讀取資料,這樣保證了同步資料的可見性

Java多執行緒2 synchronized

先看一段 public class account public void deposit int my catch interruptedexception e this.money tmp public void withdraw int my catch interruptedexceptio...

執行緒同步synchronized

synchronized只是保證在同乙個時刻,其他執行緒不能訪問鎖定的資源,但是其他方法或者是變數不能鎖定控制的 synchronized obj 上面語法格式中synchronized後括號裡的obj就是同步監視器,上面 的含義是 執行緒開始執行同步 塊之前,必須先獲得對同步監視器的鎖定。任何時刻...

synchronized同步方法

關鍵字synchronized 如果是在方法內的變數,則無所謂的的變數同步問題。因為在方法內部的變數都是私有的。synchronized如果是加在方法上面,則是對該物件的例項進行同步。如果有兩個執行緒同時對該方法進行操作,則會同步進行。對個例項多個執行緒,不存在同步的問題,那時jvm會生成多個鎖,應...