Skip to content

Commit 9b9f148

Browse files
author
wbl
committed
修改TimerTaskList的同步
1 parent c043974 commit 9b9f148

File tree

2 files changed

+28
-18
lines changed

2 files changed

+28
-18
lines changed

src/main/java/tech/treeroot/Main.java

+5
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ public static void main(String[] args) {
1616
timer.add(new DemoTimerTask(15000));
1717
timer.add(new DemoTimerTask(30000));
1818
timer.add(new DemoTimerTask(30000));
19+
TimerTask timerTask = new DemoTimerTask(20000);
20+
timer.add(timerTask);
21+
timerTask.cancel();
22+
23+
1924
}
2025

2126
private static class DemoTimerTask extends TimerTask {

src/main/java/tech/treeroot/timer/TimerTaskList.java

+23-18
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,21 @@ public TimerTaskList(AtomicInteger taskCounter) {
1717
this.taskCounter = taskCounter;
1818
}
1919

20-
public synchronized void add(TimerTaskEntry timerTaskEntry) {
20+
public void add(TimerTaskEntry timerTaskEntry) {
2121
boolean done = false;
2222
while (!done) {
23-
if (timerTaskEntry.list == null) {
24-
TimerTaskEntry tail = root.prev;
25-
timerTaskEntry.next = root;
26-
timerTaskEntry.prev = tail;
27-
timerTaskEntry.list = this;
28-
tail.next = timerTaskEntry;
29-
root.prev = timerTaskEntry;
30-
taskCounter.incrementAndGet();
31-
done = true;
23+
timerTaskEntry.remove();
24+
synchronized(this) {
25+
if (timerTaskEntry.list == null) {
26+
TimerTaskEntry tail = root.prev;
27+
timerTaskEntry.next = root;
28+
timerTaskEntry.prev = tail;
29+
timerTaskEntry.list = this;
30+
tail.next = timerTaskEntry;
31+
root.prev = timerTaskEntry;
32+
taskCounter.incrementAndGet();
33+
done = true;
34+
}
3235
}
3336
}
3437
}
@@ -42,14 +45,16 @@ public long getExpiration() {
4245
return expiration.get();
4346
}
4447

45-
public synchronized void remove(TimerTaskEntry timerTaskEntry) {
46-
if (timerTaskEntry.list.equals(this)) {
47-
timerTaskEntry.next.prev = timerTaskEntry.prev;
48-
timerTaskEntry.prev.next = timerTaskEntry.next;
49-
timerTaskEntry.next = null;
50-
timerTaskEntry.prev = null;
51-
timerTaskEntry.list = null;
52-
taskCounter.decrementAndGet();
48+
public void remove(TimerTaskEntry timerTaskEntry) {
49+
synchronized(this) {
50+
if (timerTaskEntry.list.equals(this)) {
51+
timerTaskEntry.next.prev = timerTaskEntry.prev;
52+
timerTaskEntry.prev.next = timerTaskEntry.next;
53+
timerTaskEntry.next = null;
54+
timerTaskEntry.prev = null;
55+
timerTaskEntry.list = null;
56+
taskCounter.decrementAndGet();
57+
}
5358
}
5459
}
5560

0 commit comments

Comments
 (0)