🎊專欄【JavaSE】
🍔喜歡的詩句:路漫漫其修遠兮,吾將上下而求索。
🎆音樂分享【如愿】
🎄歡迎并且感謝大家指出小吉的問題🥰
文章目錄
- 🍔生命周期
- 🎄線程的安全問題
- 🏳??🌈原因
- ?改進方法
- 🌺同步代碼塊
- ?細節
- 🌺同步方法

🍔生命周期
🎄線程的安全問題
發現有兩個問題,相同的票出現了多次,出現了超出范圍的票
🏳??🌈原因
首先線程被線程一搶走了
線程一執行到了sleep,會休眠10ms,然后ticket+1,變為了1
然后線程被線程二搶走了
線程二執行到了sleep,會休眠10ms,然后ticket+1,變為了2
然后線程被線程三搶走了
線程三執行到了sleep,會休眠10ms,然后ticket+1,變為了3
現在ticket是3,就會打印3次ticket=3的結果
這就是重復票和超出范圍的原因
?改進方法
我們把下面的代碼給框起來,設置一個線程執行完這個代碼塊后,其他線程才能執行
🌺同步代碼塊
把操作共享數據的代碼給鎖起來
synchronizd(鎖){操作共享數據的代碼
}
- 鎖默認打開,有一個線程進去了,鎖自動關閉
- 里面的代碼全部執行完畢,線程出來,鎖自動打開
我們把之前的代碼塊用鎖包圍起來康康效果如何
運行成功
MyThread.java
public class MyThread extends Thread {//表示這個類的所有對象,都共享ticket數據static int ticket = 0;//0~99//鎖的對象,一定要是唯一的static Object obj=new Object();@Overridepublic void run() {while (true) {synchronized (obj) {if (ticket < 100) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}ticket++;System.out.println(getName() + "正在賣第" + ticket + "張票");} else {break;}}}}
}
Demo1.java
package IODemo6;public class Demo1 {public static void main(String[] args) throws InterruptedException {//創建線程對象MyThread t1=new MyThread();MyThread t2=new MyThread();MyThread t3=new MyThread();//起名字t1.setName("窗口一");t2.setName("窗口二");t3.setName("窗口三");//開啟線程t1.start();t2.start();t3.start();}
}
?細節
- 鎖必須要寫到循環里面
- 鎖對象必須唯一
🌺同步方法
就是把synchronized關鍵字加到方法上
修飾符 synchronized 返回值類型 方法名(方法參數){......
}
MyRunnable.java
public class MyRunnable implements Runnable{int ticket=0;@Overridepublic void run() {while (true){//同步方法if (method()) break;}}public synchronized boolean method(){//共享數據 到了末尾if (ticket==100){return true;}else {//共享數據 沒有到末尾try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}ticket++;System.out.println(Thread.currentThread().getName()+"在賣第"+ticket+"張票!!!");}return false;}
}
ThreadDemo.java
public class ThreadDemo {public static void main(String[] args) {MyRunnable mr=new MyRunnable();Thread t1=new Thread(mr);Thread t2=new Thread(mr);Thread t3=new Thread(mr);t1.setName("窗口1");t2.setName("窗口2");t3.setName("窗口3");t1.start();t2.start();t3.start();}
}
如果大家有不明白的知識點,歡迎在評論區進行討論