學習多執行緒大家都對它的鎖感到鬱悶,一般它的鎖物件可以有object,當前類物件this,以及修飾static方法時的類class檔案。
比如對於同步**塊:
while (true) catch (interruptedexception e)
system.out.println(thread.currentthread().getname() + "還有"
+ (ticket--) + "張票");
} else
break;
}
對於函式中的同步鎖:
public synchronized void show() catch (interruptedexception e)
system.out.println(thread.currentthread().getname() + "還有"
+ (ticket--) + "張票");
} } }
以及static函式中的同步鎖:
public synchronized static void show2()
他們3者之間的鎖物件不同,對於**塊來說,它的鎖是任意的object物件,如果我們使用了**塊和函式同步,那麼我們的鎖物件要換位this,這樣才能保證執行緒的安全性,而如果我們使用static函式和**塊同步鎖,那麼鎖物件要使用static函式所在的類的class**塊,如threaddemo1.class。
對於兩個或兩個以上的執行緒訪問同乙個資源時,要注意執行緒的安全問題,如:input執行緒向res類中寫資料,output讀資料。
資源物件:
package lh.zjzk;
/** * 此資源類似與,工廠流水線上的產品,一進,一出
* @author administrator
* */
public class res
加工執行緒:
package lh.zjzk;
public class input implements runnable
int x = 0 ;
@override
public void run() catch (interruptedexception e)
if(x % 2 ==0)else
x = (x+1) % 2;
res.flag = true;//賦值過後,將喚醒標誌改為true
res.notify();//喚醒output執行緒輸出
}} }
}
搬運執行緒:
package lh.zjzk;
public class output implements runnable
@override
public void run() catch (interruptedexception e)
system.out.println(res.name + "--->"+res.***);
res.flag = false;//將喚醒標誌改為false
res.notify();//喚醒input物件進行賦值
}} }
}
主程式呼叫加工和搬運執行緒進行操作:
package lh.zjzk;
public class threadmain
}
輸出結果:
java多執行緒 執行緒八鎖
乙個物件裡面如果有多個synchronized方法,某乙個時刻內,只要乙個執行緒去呼叫其中的乙個synchronized方法了,其它的執行緒都只能等待,換句話說,某乙個時刻內,只能有唯一乙個執行緒去訪問這些synchronized方法鎖的是當前物件this,被鎖定後,其它的執行緒都不能進入到當前物件...
Java多執行緒 樂觀鎖 悲觀鎖
悲觀鎖 pessimistic lock 顧名思義,就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。樂觀鎖 optim...
Java多執行緒 鎖物件
前面總結了多個執行緒訪問同乙個物件的同步方法以同步執行,多個執行緒訪問多個物件的同步方法則以非同步方式執行,那如果多個執行緒分別訪問乙個物件中同步方法和非同步方法會如何執行那?demo myobject類 包含了乙個同步方法和乙個非同步方法 public class myobject catch i...