① java多線程加鎖的問題
publicclassTest{
publicstaticvoidmain(String[]args)throwsInterruptedException{
System.out.println("2個線程開始執行....");
TestHellohello1=newTestHello("A",1000);
TestHellohello2=newTestHello("B",2000);
Threaddemo1=newThread(hello1);
Threaddemo2=newThread(hello2);
demo1.start();
demo2.start();
try{
demo1.join();
demo2.join();
}finally{
System.out.println("線程均執行完成....");
}
}
}
{
privateStringworkname;
privateintworktime;
//省略workname和worktime的set和get方法
publicTestHello(Stringworkname,intworktime){
super();
this.workname=workname;
this.worktime=worktime;
}
publicvoidrun(){
for(inti=0;i<5;i++){
System.out.println(this.workname+"運行"+i);
try{
Thread.sleep(worktime);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
}
}
② java的 多線程應用 加鎖解鎖,使用多線程應當注意什麼
1,加鎖和解鎖就是把一段代碼括起來,也可以說是同步,
2,一般需要加鎖的代碼涉回及到了共享數據,如果多個答線程都開始執行這段代碼那麼就會出現異常結果,
3,給這段代碼開始和結尾加鎖以後這段代碼只能有一個線程進來,數據就安全了,比如下面這段代碼,
int i = 100;
if( i > 0) {
System.out.println( i -- );
}
假如這里有4個線程執行這段代碼,結果就可能出現負數,因為 i = 1的時候,假如線程1槍到了CPU的執行權,執行到了System.out.println( i -- );這里,但是還沒有執行,這時候線程2搶到了執行權,因為 i 還沒有進行自減,所以線程2也執行到了System.out.println( i -- );這句話,這時候無論誰先執行,i 就等於0了,再次執行的話就出現了負數,
③ 關於JAVA里的加鎖synchronized
1.凡使用synchronized標記的方法復,比如 public synchronized void func1() { .... },則制同時只有一個線程能夠運行這個方法。比如,線程1正在運行func1,則其他線程需要運行func1的話,會卡住,等線程1運行func1結束後,其他線程中,才會有一個幸運兒成功爭取到運行func1的資格,然後這個幸運兒線程開始運行func1。沒有爭取到運行資格的其他線程,會繼續等待。
2.你的例子中,被鎖定的是 方法 m1,而不是屬性b。所以,m1的synchronized加鎖操作,與b沒有半點毛錢關系。
3.要實現你的鎖b想法,其實很簡單。去買一件貞操寶甲來就行了。開玩笑,哈哈。要鎖b,把main方法里的tt.m2()修改為tt.m1()。
4.以後別用「b」作為變數,總覺得怪怪了。也許你現在還沒長大,很單純。但大人的世界裡,「b」是一種不文雅但又對人類的未來有重要作用的東西。建議用cb來代替b。
④ java代碼右下角加鎖能運行嗎為什麼
能。java代碼右下角加鎖能運行,是因為多線程共享的代碼區域需要上鎖,防止多線程同時訪問代碼塊,造成線程安全問題。
⑤ java的加鎖機制的問題,簡單回答一下就好
每個對象有唯一的一把鎖。鎖被某個線程獲得後,其他線程會阻塞等待,直到鎖被釋放且獲得。
語法
synchronize(對象){
....
},意思就是當前線程需要獲得該對象的鎖才能運行之後同步塊中的代碼,沒獲得就阻塞等待。
這樣就避免對該對象同時有多個線程讀寫,造成數據不同步的問題,從而實現了「同步synchronization」
⑥ java加鎖
對象是一個鎖標志。按照先到先得的原則,如果有多個線程都會執行代碼,並使用同一個對象作為鎖,
synchronize(對象){
....
}
那麼,先執行這段代碼的那個線程,將會獲得這個對象鎖,而當這個線程執行這段代碼的時候,其他線程也是使用這個對象作為鎖的,就不能執行這段代碼,知道最初得到這個鎖的線程運行完這段代碼,然後再把鎖分配給下一個線程執行。
⑦ java中 請問我應該如何如何鎖這段代碼才符合要求
public Object getObject(String key,Object o) {
synchronized (map) {
if(map.get(key)==null) {
map.put(key,o)
}else {
return map.get(key);
}}// 格式沒法弄,自己弄一下
}
// demol0326 的回答意思使用MyTest的實例來加鎖,但是map是static的,無法鎖住
// MyTest的多個實例在多個線程中的請求
//禾木雙子 :如果A線程在getObject方法的第二行停止,此時B線程進入getObject後執行部分代碼, 此時B線程停止,A線程啟動,他不會執行'多線程處理', 仍然有線程線程安全問題,(想像一下更多的線程進入該方法的情況,num甚至會得到負值)
⑧ JAVA編程同步,加鎖如何實現,有何優缺點
同步鎖「synchronize」,手動鎖Lock
synchronize:自動鎖住,自動開鎖。(自動都是建立在一定的條件上的)
Lock:手動,手動鎖住,手動開鎖
具體如何實現,這里不好說,一時說不清,自行搜索。
⑨ 如何使用java的鎖機制
多線程同步的實現最終依賴鎖機制。我們可以想像某一共享資源是一間屋子,每個人都是一個線程。當a希望進入房間時,他必須獲得門鎖,一旦a獲得門鎖,他進去後就立刻將門鎖上,於是b,c,d...就不得不在門外等待,直到a釋放鎖出來後,b,c,d...中的某一人搶到了該鎖(具體搶法依賴於jvm的實現,可以先到先得,也可以隨機挑選),然後進屋又將門鎖上。這樣,任一時刻最多有一人在屋內(使用共享資源)。
java語言規范內置了對多線程的支持。對於java程序來說,每一個對象實例都有一把「鎖」,一旦某個線程獲得了該鎖,別的線程如果希望獲得該鎖,只能等待這個線程釋放鎖之後。獲得鎖的方法只有一個,就是synchronized關鍵字。
⑩ JAVA編程同步,加鎖如何實現,有何優缺點
加鎖的方式有非常多,可以在程序上使用。或者是在資料庫上操作。保證事務一致性即可