synchronized關鍵字
同步監視器用來解決多線程發生數據錯亂的問題
在一個線程操作數據時,其他線程無法同時操作同一數據
同步監視器只能是對象
並且推薦使用共享資源的對象
可以是當前對象(this),也可以是其他對象
1、可以有兩種方法,一種是同步代碼塊,即將多個線程需要訪問的同一塊代碼用synchronized包圍
這個代碼模擬買票系統,synchronized包圍的代碼是多個買票窗口需要共同訪問的代碼,在一個用戶購票時,其他用戶無法訪問代碼,以此保證票數不會出現錯誤,這就是爲什麼平時購票時,看到有餘票,但是已下單就沒有的原因。
synchronized (this) { //同步代碼 塊
if (ticket>0) { //有票
try {
Thread.sleep(300); //模擬出票時間3秒
} catch (InterruptedException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在賣第"
+(ticket--)+"張票");
}
}
//這個代碼模擬買票系統,synchronized包圍的代碼是多個買票窗口需要共同訪問的代碼
2、第二種方法是,將同步代碼塊提出來,新建一個同步方法,而後直接調用即可。
/**
* 同步方法
*/
private synchronized void saleTicket() {
// TODO 自動生成的方法存根
if (ticket>0) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在賣第"
+(ticket--)+"張票");
}
}