線程安全問題產生的原因: 1,多個線程在操作共享的數據。 2,操作共享數據的線程代碼有多條。 當一個線程在執行操作共享數據的多條代碼過程中,其他線程參與了運算。就會導致線程安全問題的產生。
解決思路; 就是將多條操作共享數據的線程代碼封裝起來,當有線程在執行這些代碼的時候,其他線程時不可以參與運算的。 必須要當前線程把這些代碼都執行完畢后,其他線程才可以參與運算。 在java中,用同步代碼塊就可以解決這個問題。
同步代碼塊的格式:
synchronized(對象){需要被同步的代碼 ;}同步的好處:解決了線程的安全問題。 同步的弊端:相對降低了效率,因為同步外的線程的都會判斷同步鎖。 同步的前提:同步中必須有多個線程并使用同一個鎖。
例1:多個窗口購買火車票實例:
package day04;public class JavaTest { public static void main(String[] args) { SaleTicket st=new SaleTicket(); Thread t1=new Thread(st,"一號窗口"); Thread t2=new Thread(st,"二號窗口"); Thread t3=new Thread(st,"三號窗口"); Thread t4=new Thread(st,"四號窗口"); t1.start(); t2.start(); t3.start(); t4.start(); }}class SaleTicket implements Runnable{//sale英 [se?l] n.拍賣;賣,出賣; PRivate int tickets=100; @Override public void run() { while(tickets>0){ sale(); } } private synchronized void sale(){//synchronized 同步。 if(tickets>0){ System.out.println(Thread.currentThread().getName()+"賣出了第"+(100-tickets+1)+"張票"); tickets --; try{ Thread.sleep(500);//假設購票過程需要500毫秒。 }catch(InterruptedException e){ e.printStackTrace(); } } }}運行結果:
一號窗口賣出了第1張票四號窗口賣出了第2張票二號窗口賣出了第3張票三號窗口賣出了第4張票三號窗口賣出了第5張票.................四號窗口賣出了第99張票四號窗口賣出了第100張票新聞熱點
疑難解答