多线程别怕,有锁就安全;(解决线程安全问题)
多線程de小事情
導航不迷路:文章目錄
- 多線程de小事情
- 前言
- 打油詩
- 何為線程同步?
- 如何實現線程同步?
- 1.Synchronized方法;
- 案例
- 2.Synchronized塊;
- 案例
- つづく…
前言
多線程分享資源優點是速度快,但是會出現安全問題;那怎么辦解決呢?一首打油詩送給您;打油詩
救線吟
作者:遅咲きの向日葵
多線程,享資源;
安全問題,據錯亂;
不要急,莫要亂;
線程同步,把鎖看;
何為線程同步?
線程同步其實就是一種等待機制,多個需要同時訪問此對象的線程進入這個對象的等待池形成隊列,等待前面的線程使用完畢后,下一個線程再使用。
如何實現線程同步?
1.Synchronized方法;
通過在方法聲明中加入 synchronized 關鍵字來聲明,語法如下:
public synchronized void accessVal(int newVal);
原理
synchronized 方法控制對“對象的類成員變量”的訪問:每個對象對應一把鎖,每個synchronized 方法都必須獲得調用該方法的對象的鎖方能執行,否則所屬線程阻塞,方法一旦執行,就獨占該鎖,直到從該方法返回時才將鎖釋放,此后被阻塞的線程方能獲得該鎖,重新進入可執行狀態。
缺點
若將一個大的方法聲明為 synchronized 將會大大影響效率;
案例
案例:設計一個火車售票模擬程序;假如只剩五張票,三個窗口同時售票,每個窗口都有100人在排隊;
車票類代碼
public class Ticket4 implements Runnable{private int ticket = 5;@Overridepublic void run() {for(int i=0;i<100;i++) {this.saleTicket();}}private synchronized void saleTicket() {if(ticket>0) {try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(Thread.currentThread().getName()+"正在賣第"+ticket--+"張票");}}}測試類
public class TestTicket4 {public static void main(String[] args) {Ticket4 ticket4 = new Ticket4();Thread t1 = new Thread(ticket4,"A窗口");Thread t2 = new Thread(ticket4,"B窗口");Thread t3 = new Thread(ticket4,"C窗口");t1.start();t2.start();t3.start();}}運行結果
CPU太偏心了,就讓A出風頭!
2.Synchronized塊;
通過 synchronized 關鍵字來聲明 synchronized 塊,語法如下:
synchronized(syncObject)
{
//允許訪問控制的代碼
}
優點
對于synchronized方法的缺點,synchronized塊便可解決;
Synchronized塊可以精確地控制到具體的“成員變量”,縮小同步范圍,提高效率;
建議
Synchronized(syncObject){}中的syncObject對象又名:同步監視器;
同步監視器只能是對象,推薦使用共享資源的對象,可以是當前對象this,也可以是其他的共享對象;
案例
案例:設計一個火車售票模擬程序;假如只剩五張票,三個窗口同時售票,每個窗口都有100人在排隊;
車票類代碼
public class Ticket3 implements Runnable{private int ticket=5;@Overridepublic void run() {for(int i=0;i<100;i++) {synchronized(this) {if(ticket>0) {try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(Thread.currentThread().getName()+"正在賣"+ticket+"張票");}ticket--;}}} }測試類
public class TestTicket3 {public static void main(String[] args) {Ticket3 ticket3 = new Ticket3();Thread t1 = new Thread(ticket3,"A窗口");Thread t2 = new Thread(ticket3,"B窗口");Thread t3 = new Thread(ticket3,"C窗口");t1.start();t2.start();t3.start();}}運行結果
只能說A是CPU的菜!
つづく…
感謝您的觀看;后續仍然會不斷更新多線程,最終會以生產者消費者模式的小項目結束;
敬請期待;
總結
以上是生活随笔為你收集整理的多线程别怕,有锁就安全;(解决线程安全问题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Exception in thread
- 下一篇: 新世界的开启