【解決線程安全問題:同步方法】
阿新 • • 發佈:2018-09-01
nbsp exceptio ket @override pan 解決 ticket oid tst
同步方法:就是把同步關鍵字加到方法上
同步方法的鎖對象是什麽呢?this(不信可以試試把下面的this換成其它對象)
package com.test; public class SellTicket implements Runnable { /**註意,如果是用繼承的方式,此處必須用靜態修飾*/ private int tickets = 60; private int x = 0; @Override public void run(){ while(true){ if(x%2==0){synchronized(this){ doSell(); } }else{ sellTicket(); } x++; } } private synchronized void sellTicket() { doSell(); } private void doSell() { if(tickets>0){try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"正在出售第"+tickets+"張票"); tickets--; } } }
package com.test; public class SellTicketTest {public static void main(String[] args){ SellTicket sellTicket = new SellTicket(); Thread t1 = new Thread(sellTicket,"窗口一"); Thread t2 = new Thread(sellTicket,"窗口二"); Thread t3 = new Thread(sellTicket,"窗口三"); t1.start(); t2.start(); t3.start(); } }
如果是同步靜態方法,那麽鎖對象就不是this了,而是類的class文件。
【解決線程安全問題:同步方法】