線程安全問題產生的原因:
1,多個線程在操作共享的數據。
2,操作共享數據的線程代碼有多條。
當一個線程在操作共享數據的多條代碼過程中,其他線程參與了運算。
就會導致線程安全問題的產生。
解決思路:
就是將多條操作共享數據的線程代碼封裝起來,當有線程在執行這些代碼的時候,
其他線程是不可以參與運算的
必須要當前線程把這些代碼執行完畢后,其他線程才可以參與運算
在java中,用同步代碼塊就可以解決這個問題。
同步代碼塊的格式:
synchronized(對象){
需要被同步的代碼:
}
同步的好處:解決了線程的安全問題。
同步的弊端:相對降低了效率,因為同步外的線程都會判斷同步鎖。
同步的前提:同步中必須有多個線程并使用同一個鎖。
class Ticket implements Runnable{ //extends Thread{
private int num = 100;
Object obj = new Object();
public void run(){
while (true){
synchronized(obj){
if (num>0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"...sale..."+num--);
}
}
}
}
}
public class SaleTicket {
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();
/*
Ticket t1 = new Ticket();
// Ticket t2 = new Ticket();
// Ticket t3 = new Ticket();
// Ticket t4 = new Ticket();
t1.start();
t1.start();
t1.start();
t1.start();
*/
}
}