多執行緒中有寫程式是由一寫bug的,學習執行緒鎖,很經典的例子,買票案例
有a,b,c三個視窗,同時售賣100張票,最後可能會出現賣了重複的票,或者多賣了,賣超了等執行緒不安全問題
看乙個執行緒不安全的賣票**:
小明,小張,小王同時去買票,就會出現上面的執行緒不安全問題,因為,視窗1賣了1張票,而另外兩個視窗不知道,又把第一張票賣了出去,所有會出現賣超,重複賣等不安全問題
public
class
testthread4
implements
runnable
catch
(interruptedexception e)
system.out.
println
(thread.
currentthread()
.getname()
+"拿到了第:"
+ticket--
+"票");
}else}}
public
static
void
main
(string[
] args)
}
出現了執行緒不安全問題應該怎麼修改呢?
新增乙個執行緒鎖:synchronized
簡簡單單乙個乙個鎖,就可以解決問題,可在日常我們寫**的時候,這個鎖我們應該新增在**呢?
在這個程式裡,要判斷是否有票,如果有票,要賣票,所以會減少,所以鎖就會加在判斷是否有票這個方法上,一般情況下,鎖應該夾在有 「增刪改」 資料的地方,可以是方法,也可以是屬性
public
class
unsafebuyticket
}class
buyticket
implements
runnable
}//判斷是否有票
private
synchronized
void
buy(
)//模擬延時
trycatch
(interruptedexception e)
//買票
system.out.
println
(thread.
currentthread()
.getname()
+"賣了第"
+tickernums--
+"票");
}}
執行緒之互斥鎖
在乙個多執行緒的程式中,有時需要同時對共享資源的訪問,就會造成對共享資源的讀寫問題。例如 有五個執行緒,其中乙個對共享資源進行修改,其餘四個執行緒需要同時對共享資源進行讀訪問。勢必會造成其餘四個執行緒讀取資料的不穩定。此時就可以使用互斥鎖去解決這一問題。當修改共享資源的執行緒需要對資料進行修改時,首...
java併發程式設計之Synchronized關鍵字
1.synchronized關鍵字使用前介紹 1 使用synchronized關鍵字修飾方法,ps 在這裡要特別需要注意的是,當有兩個或者以上執行緒的時候,其中有乙個執行緒獲取了該方法的物件鎖執行同步方法的時候,其他的執行緒仍然可以訪問其他的非使用synchronized的方法,也就是非同步的了。2...
java併發程式設計之synchronized
上篇部落格沒寫好,排版改了好多次,看著實在頭疼所以就沒準備往下寫了,今天講下同步使用到的關鍵字synchronized,這個關鍵字可以是用在方法上,也可以使用再 塊上,synchronized作用在方法上,它的鎖物件是當前例項物件 public class syncthreadtest implem...