線程安全問題產生的原因:
1.多個線程在操作共享的數據
2. 操作共享數據的線程代碼有多條
用示例解釋如下:開啟瞭四條線程 ,同時操作共享的數據,並且有兩條操作共享數據的線程代碼
class Ticket implements Runnable//extends Thread { private int tick = 100; public void run() { while(true) { if(tick>0) //操作一次共享數據 { System.out.println(Thread.currentThread().getName()+"....sale : "+ tick--);//第二次操作共享數據 } } } } class TicketDemo { public static void main(String[] args) { Ticket t = new Ticket(); Thread t1 = new Thread(t);//創建瞭一個線程; Thread t2 = new Thread(t);//創建瞭一個線程; Thread t3 = new Thread(t);//創建瞭一個線程; Thread t4 = new Thread(t);//創建瞭一個線程; t1.start(); t2.start(); t3.start(); t4.start(); } }
解決思路:
就是將多條操作共享數據的線程代碼進行封裝,當有線程在執行這些代碼的時候,其他線程不能參與運算。必須是當前線程執行完這些代碼後,其它線程才能參與運算。 通常使用同步代碼塊或者 同步函數 。synchronized