JAVA多線程——同步監視器,同步代碼塊,同步方法,synchronized關鍵字,解決多線程同步安全問題

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--)+"張票");
 	 }
 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章