내 연락처 정보
우편메소피아@프로톤메일.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
public class TicketDemo {
// 票总数
private int ticketNum = 10;
/**
* 抢票
*/
public void getTicket() {
if (ticketNum <= 0) {
return;
}
System.out.println(Thread.currentThread().getName() + " 抢到一张票,剩余:" + ticketNum);
// 非原子性操作
ticketNum--;
}
/**
* 测试:20个人抢一张票
*/
public static void main(String[] args) {
TicketDemo ticketDemo = new TicketDemo();
for (int i = 0; i < 20; i++) {
new Thread(ticketDemo::getTicket).start();
}
}
}
결과:
나타나는 것을 볼 수 있습니다 과매도 문제 , 총 10장의 티켓이 있습니다. 20개의 스레드가 함께 티켓을 구매하면 11명이 티켓을 구매한 것으로 나타납니다. 이는 두 스레드가 동시에 if 검사를 통과하기 때문입니다.
따라서 하나의 스레드만이 티켓 공제를 동시에 확인하고 실행할 수 있도록 티켓 작업을 잠글 필요가 있습니다.
public class TicketDemo {
// 锁
private static Object lock = new Object();
// 票总数
private int ticketNum = 10;
/**
* 抢票
*/
public void getTicket() {
synchronized (lock) {