【執行緒安全概念】
當多個執行緒訪問某乙個類(或物件、方法)時,這個類始終都能表現出正確的行為,那麼這個類就是執行緒安全的。
【synchronized】
可以在任意物件及方法上加鎖,而加鎖的這段**被稱為「互斥區」或「臨界區」。
【不加synchronized和加synchronized的不同情況】
package com.higgin.part1;【執行結果:不加synchronized鎖(結果無法確定)】public
class
mythread extends thread
public
static
void
main(string args)
}
【執行結果:加synchronized鎖】
【多個執行緒多個鎖的情況(區別物件鎖和類鎖)】
package com.higgin.part2;【執行結果:不加static,非靜態方法,為物件鎖,可以看到t1和t2兩個執行緒時併發執行的】public
class
mythread
else
if(tag.equals("b"
)) system.
out.println("
【finally】tag =
"+tag +"
, num =
"+num);
} catch
(interruptedexception e)
}public
static
void
main(string args)
});thread t2 = new thread(new
runnable()
});t1.start();
//如果執行緒安全,必須得等t1執行完run方法,釋放鎖之後,t2才能獲得鎖執行run方法
t2.start();}}
【執行結果:加上static,靜態方法,為類鎖,t1和t2同步執行】
【物件的同步和非同步】
同步:synchronized
同步的概念就是共享,要牢記「共享」兩個字,如果不是共享的資源,沒有必要同步。
非同步:asynchronized
非同步的概念就是獨立,相互之間不受到任何制約。比如http請求中,在頁面發起ajax請求時,我們依然可以繼續瀏覽或者操作頁面內容,二者之間沒有任何關係。
[ 執行緒安全的特性 ]
同步的目的就是為了執行緒安全,執行緒安全的兩個特性:原子性(同步)、可見性。
package com.higgin.part3;/**【執行結果:readnum()不加synchrobized鎖,t1持有setnum方法的鎖,但t2不會去等待t1釋放鎖,直接去執行readnum方法】* 物件鎖的同步和非同步問題 */
public
class
myobject
catch
(interruptedexception e)
}/*
** 針對的是同乙個物件的物件鎖
* 加上synchronized :當乙個執行緒已經在執行setnum()方法的時候,另乙個執行緒無法訪問readnum方法
* 不加synchronized :當乙個執行緒已經在執行setnum()方法的時候,另乙個執行緒可以訪問readnum方法
*/public
void
readnum()
public
static
void
main(string args)
},"t1
");
thread t2 = new thread(new
runnable()
},"t2
");t1.start();
t2.start();}}
【執行結果:readnum()加上synchronized鎖,t1持有setnum方法的鎖,t2必須等待t1釋放鎖才能獲得readnum方法的鎖】
【分析】
上面這個例子即乙個「髒讀」的例子。
對乙個物件的方法加鎖時,需要考慮業務的完整性,即為setvalue()/getvalue()方法同時加鎖synchronized關鍵字,保證業務的完整性。
【問:當乙個執行緒進入乙個物件的synchronized的方法時,其他執行緒是否可以進入此物件的其他方法?】
答:1.如果是建立的不同物件(如myobj1、myobj2物件),那麼兩個物件執行各自的方法不會相互影響,為非同步的。
2.如果是同乙個物件(只有乙個myobj物件),如果乙個執行緒進入乙個物件的synchronized修飾的方法,如果其他的那個方法是非sychronized方法,那麼是可以訪問的。
3.如果是同乙個物件(只有乙個myobj物件),如果乙個執行緒進入乙個物件的synchronized修飾的方法,如果其他的那個方法是sychronized方法,那麼是不可以訪問的。
多執行緒 13 守護執行緒
執行緒分為兩大類 使用者執行緒和守護執行緒 daemon 一般預設為使用者執行緒,守護執行緒不看虛擬機器的臉色,而是看使用者執行緒的臉色,虛擬機器必須確保使用者執行緒執行完畢,守護執行緒是為使用者執行緒服務的,不用等它執行完畢,它默默的為我們服務比如後台日誌,監控記憶體。練習 package com...
執行緒安全與執行緒不安全
執行緒安全是針對多執行緒來講的,如果所使用的公用變數在多執行緒下沒有被保護機制時,變數結果會和理論值不一致,這樣就叫作執行緒不安全,相反公用變數在保護機制下工作,就不會出現 隨機 變化,這時叫執行緒安全。執行緒安全 在多執行緒中使用時,不用自已做同步處理.執行緒不安全 在多執行緒中使用時,必須做執行...
執行緒安全與執行緒不安全
執行緒安全是針對多執行緒來講的,如果所使用的公用變數在多執行緒下沒有被保護機制時,變數結果會和理論值不一致,這樣就叫作執行緒不安全,相反公用變數在保護機制下工作,就不會出現 隨機 變化,這時叫執行緒安全。執行緒安全 在多執行緒中使用時,不用自已做同步處理.執行緒不安全 在多執行緒中使用時,必須做執行...