如何保證同一資源被多個執行緒併發訪問時的完整性?詹姆哥哥2019-02-26 21:27:19

題主的問題可以理解為執行緒安全問題。

第一種:synchronized關鍵字,將操作共享資料的語句加入synchronized關鍵字,在某一時段只會讓一個執行緒執行完,在執行過程中,其他執行緒不能進來執行。如下程式碼,只需將class1增加如下標記部分:

public class TrainTickets implements Runnable{

int ticketnum = 20;

public void run(){

boolean a = true;

while (a) {

synchronized (this) { //新增

if (ticketnum > 0) {

System。out。println(Thread。currentThread()。getName() + “ 售出 ” + ticketnum + “號 票。”);

ticketnum——;

} else if (ticketnum <= 0) {

a = false;

}

try {

Thread。sleep(100);

} catch (Exception e) {

e。printStackTrace();

}

} //新增

}

}

}

第二種:使用Lock鎖,Lock使用起來比較靈活,但需要手動釋放和開啟。在併發量比較高的情況下,synchronized會讓效能下降,此時使用Lock是個不錯的方案。如下程式碼,只需將class1增加如下標記部分:

public class TrainTickets implements Runnable{

int ticketnum = 20;

Lock lock = new ReentrantLock();

public void run(){

boolean a = true;

while (a) {

try {

lock。lock();// 獲取鎖物件

if (ticketnum > 0) {

System。out。println(Thread。currentThread()。getName() + “ 售出 ” + ticketnum + “號 票。”);

ticketnum——;

} else if (ticketnum <= 0) {

a = false;

}

Thread。sleep(100);

} catch (Exception e) {

e。printStackTrace();

}finally{

lock。unlock();// 釋放鎖物件

}

}

}

}