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會生成多個鎖,應...