Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 3df0e54

Browse files
Create TicketLock.java
1 parent cbcc154 commit 3df0e54

File tree

1 file changed

+23
-0
lines changed
  • concurrency/src/main/java/com/javaedge/concurrency/example/lock

1 file changed

+23
-0
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import java.util.concurrent.atomic.AtomicInteger;
2+
3+
public class TicketLock {
4+
private AtomicInteger serviceNum = new AtomicInteger(); // 服务号
5+
private AtomicInteger ticketNum = new AtomicInteger(); // 排队号
6+
7+
public int lock() {
8+
// 首先原子性地获得一个排队号
9+
int myTicketNum = ticketNum.getAndIncrement();
10+
11+
// 只要当前服务号不是自己的就不断轮询
12+
while (serviceNum.get() != myTicketNum) {
13+
}
14+
15+
return myTicketNum;
16+
}
17+
18+
public void unlock(int myTicket) {
19+
// 只有当前线程拥有者才能释放锁
20+
int next = myTicket + 1;
21+
serviceNum.compareAndSet(myTicket, next);
22+
}
23+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /