對java多線程的理解,歡迎指責
實現Runnable的好處:
1.避免單繼承的侷限性
2.將線程的任務從線程的子類中分離出來,進行了單獨的封裝,按照面向對象的思想封裝成對象
Runnable r = new Student();
Thread thread = new Thread(r);
thread.start();
synchronized表示當前線程,獨佔 對象 someObject
當前線程獨佔 了對象someObject,如果有其他線程試圖佔有對象someObject,就會等待,直到當前線程釋放對someObject的佔用。
someObject 又叫同步對象,所有的對象,都可以作爲同步對象
爲了達到同步的效果,必須使用同一個同步對象
synchronized即爲同步關鍵字
加鎖後放入同步代碼塊 當一個線程進來時加上鎖,執行完同步代碼塊後解鎖,等待下一個線程進來
synchronized(對象鎖){
需要被同步的代碼
}
同步的好處:解決多線程的安全問題
同步的弊端:相對降低了效率,因爲同步外的線程都會判斷同步鎖
同步的前提:必須有多個線程並用同一個鎖
同步函數的鎖用的是this
同步代碼塊的鎖用任意對象,建議使用同步代碼塊
單例模式面臨的多線程問題:
餓漢式:
class Bank{
private static Bank Bank = null;
private Bank(){}
public static synchronized Bank getintance(){
if(bank==null){
bank = new Bank();
}
return bank;
}
//如果餓漢式用同步函數,當線程0進入時需進行判斷,此時已被加上鎖而阻止線程1進入
//降低了執行效率
}
class Bank{
private static Bank Bank = null;
private Bank(){}
public static synchronized Bank getintance(){
if(bank==null){
bank = new Bank();
}
return bank;
}
//如果餓漢式用同步函數,當線程0進入時需進行判斷,此時已被加上鎖而阻止線程1進入
//降低了執行效率
}
class Bank{
private static Bank Bank = null;
private Bank(){}
public static Bank getintance(){
if(bank==null){
synchronized(Bank.class){
if(bank==null){
bank = new Bank();
}
}
}
return bank;
}
//如果餓漢式用同步代碼塊,用this作爲鎖,每個線程首先判斷bank是否爲空,如果爲空則進入鎖內執行代碼塊,此時不影響
//其他線程進行判斷,當判斷不爲空時直接返回已實例化的bank,因此提高效率又帶來安全
}
1.避免單繼承的侷限性
2.將線程的任務從線程的子類中分離出來,進行了單獨的封裝,按照面向對象的思想封裝成對象
Runnable r = new Student();
Thread thread = new Thread(r);
thread.start();
synchronized表示當前線程,獨佔 對象 someObject
當前線程獨佔 了對象someObject,如果有其他線程試圖佔有對象someObject,就會等待,直到當前線程釋放對someObject的佔用。
someObject 又叫同步對象,所有的對象,都可以作爲同步對象
爲了達到同步的效果,必須使用同一個同步對象
synchronized即爲同步關鍵字
加鎖後放入同步代碼塊 當一個線程進來時加上鎖,執行完同步代碼塊後解鎖,等待下一個線程進來
synchronized(對象鎖){
需要被同步的代碼
}
同步的好處:解決多線程的安全問題
同步的弊端:相對降低了效率,因爲同步外的線程都會判斷同步鎖
同步的前提:必須有多個線程並用同一個鎖
同步函數的鎖用的是this
同步代碼塊的鎖用任意對象,建議使用同步代碼塊
單例模式面臨的多線程問題:
餓漢式:
class Bank{
private static Bank Bank = null;
private Bank(){}
public static synchronized Bank getintance(){
if(bank==null){
bank = new Bank();
}
return bank;
}
//如果餓漢式用同步函數,當線程0進入時需進行判斷,此時已被加上鎖而阻止線程1進入
//降低了執行效率
}
class Bank{
private static Bank Bank = null;
private Bank(){}
public static synchronized Bank getintance(){
if(bank==null){
bank = new Bank();
}
return bank;
}
//如果餓漢式用同步函數,當線程0進入時需進行判斷,此時已被加上鎖而阻止線程1進入
//降低了執行效率
}
class Bank{
private static Bank Bank = null;
private Bank(){}
public static Bank getintance(){
if(bank==null){
synchronized(Bank.class){
if(bank==null){
bank = new Bank();
}
}
}
return bank;
}
//如果餓漢式用同步代碼塊,用this作爲鎖,每個線程首先判斷bank是否爲空,如果爲空則進入鎖內執行代碼塊,此時不影響
//其他線程進行判斷,當判斷不爲空時直接返回已實例化的bank,因此提高效率又帶來安全
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.