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 2278952

Browse files
Java.EdgeJava.Edge
Java.Edge
authored and
Java.Edge
committed
2 parents da6425e + 3df0e54 commit 2278952

File tree

6 files changed

+228
-0
lines changed

6 files changed

+228
-0
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
public class LockSupportBlockerTest {
2+
public static void main(String[] args) {
3+
Thread t3 = new Thread(() -> {
4+
Thread.currentThread().setName("t3");
5+
System.out.println(Thread.currentThread().getName() + " park 5 seconds");
6+
//park 5 seconds, set blocker
7+
Object blocker = new String("sss");
8+
LockSupport.parkUntil(blocker, System.currentTimeMillis() + TimeUnit.MILLISECONDS.convert(5, TimeUnit.SECONDS));
9+
System.out.println(Thread.currentThread().getName() + " after park");
10+
});
11+
t3.start();
12+
13+
try {
14+
Object t3_blocker = null;
15+
while (t3_blocker == null) {
16+
t3_blocker = LockSupport.getBlocker(t3);
17+
TimeUnit.MILLISECONDS.sleep(10);
18+
}
19+
System.out.println("t3 blocker is :" + t3_blocker);
20+
t3.join();
21+
} catch (InterruptedException e) {
22+
e.printStackTrace();
23+
}
24+
}
25+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
public class LockSupportExam {
2+
public static void main(String[] args) {
3+
Thread t1 = new Thread() {
4+
@Override
5+
public void run() {
6+
Thread.currentThread().setName("t1");
7+
System.out.println(Thread.currentThread().getName() + " before park");
8+
//park 100 seconds
9+
LockSupport.parkNanos(TimeUnit.NANOSECONDS.convert(100, TimeUnit.SECONDS));
10+
System.out.println(Thread.currentThread().getName() + " after park");
11+
}
12+
};
13+
Thread t2 = new Thread() {
14+
@Override
15+
public void run() {
16+
try {
17+
Thread.currentThread().setName("t2");
18+
TimeUnit.SECONDS.sleep(1);
19+
System.out.println(Thread.currentThread().getName() + " unpark t1");
20+
LockSupport.unpark(t1);
21+
} catch (InterruptedException e) {
22+
e.printStackTrace();
23+
}
24+
25+
}
26+
};
27+
Thread t3 = new Thread() {
28+
@Override
29+
public void run() {
30+
Thread.currentThread().setName("t3");
31+
System.out.println(Thread.currentThread().getName() + " park 5 seconds");
32+
//park 5 seconds
33+
LockSupport.parkUntil(System.currentTimeMillis() + TimeUnit.MILLISECONDS.convert(5,TimeUnit.SECONDS));
34+
System.out.println(Thread.currentThread().getName() + " after park");
35+
}
36+
};
37+
t1.start();
38+
t2.start();
39+
t3.start();
40+
try {
41+
t1.join();
42+
t2.join();
43+
t3.join();
44+
} catch (InterruptedException e) {
45+
e.printStackTrace();
46+
}
47+
}
48+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
public class UnsafeTest {
2+
3+
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
4+
Field f = Unsafe.class.getDeclaredField("theUnsafe");
5+
f.setAccessible(true);
6+
Unsafe unsafe = (Unsafe) f.get(null);
7+
Thread t1 = new Thread() {
8+
@Override
9+
public void run() {
10+
Thread.currentThread().setName("t1");
11+
System.out.println(Thread.currentThread().getName() + " before park");
12+
//park 100 seconds
13+
unsafe.park(false, TimeUnit.NANOSECONDS.convert(100, TimeUnit.SECONDS));
14+
System.out.println(Thread.currentThread().getName() + " after park");
15+
}
16+
};
17+
Thread t2 = new Thread() {
18+
@Override
19+
public void run() {
20+
try {
21+
Thread.currentThread().setName("t2");
22+
TimeUnit.SECONDS.sleep(1);
23+
System.out.println(Thread.currentThread().getName() + " unpark t1");
24+
unsafe.unpark(t1);
25+
} catch (InterruptedException e) {
26+
e.printStackTrace();
27+
}
28+
29+
}
30+
};
31+
Thread t3 = new Thread() {
32+
@Override
33+
public void run() {
34+
Thread.currentThread().setName("t3");
35+
System.out.println(Thread.currentThread().getName() + " park 5 seconds");
36+
//park 5 seconds
37+
unsafe.park(true, System.currentTimeMillis() + TimeUnit.MILLISECONDS.convert(5,TimeUnit.SECONDS));
38+
System.out.println(Thread.currentThread().getName() + " after park");
39+
}
40+
};
41+
t1.start();
42+
t2.start();
43+
t3.start();
44+
try {
45+
t1.join();
46+
t2.join();
47+
t3.join();
48+
} catch (InterruptedException e) {
49+
e.printStackTrace();
50+
}
51+
}
52+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
public class SimpleLock {
2+
private static class Sync extends AbstractQueuedSynchronizer {
3+
@Override
4+
protected boolean tryAcquire(int ignore) {
5+
return compareAndSetState(0, 1);
6+
}
7+
8+
@Override
9+
protected boolean tryRelease(int ignore) {
10+
setState(0);
11+
return true;
12+
}
13+
14+
protected Sync() {
15+
super();
16+
}
17+
}
18+
19+
private final Sync sync = new Sync();
20+
21+
public void lock() {
22+
sync.acquire(1);
23+
}
24+
25+
public void unlock() {
26+
sync.release(1);
27+
}
28+
29+
private static class MyThread extends Thread {
30+
private final String name;
31+
private final SimpleLock lock;
32+
33+
private MyThread(String name, SimpleLock lock) {
34+
this.name = name;
35+
this.lock = lock;
36+
}
37+
38+
@Override
39+
public void run() {
40+
try {
41+
lock.lock();
42+
System.out.println(name + " get the lock");
43+
TimeUnit.SECONDS.sleep(2);
44+
} catch (InterruptedException e) {
45+
e.printStackTrace();
46+
} finally {
47+
lock.unlock();
48+
System.out.println(name + " release the lock");
49+
}
50+
}
51+
}
52+
53+
public static void main(String[] args) {
54+
final SimpleLock mutex = new SimpleLock();
55+
MyThread t1 = new MyThread("t1", mutex);
56+
MyThread t2 = new MyThread("t2", mutex);
57+
MyThread t3 = new MyThread("t3", mutex);
58+
t1.start();
59+
t2.start();
60+
t3.start();
61+
try {
62+
t1.join();
63+
t2.join();
64+
t3.join();
65+
} catch (InterruptedException e) {
66+
e.printStackTrace();
67+
}
68+
System.out.println("main thread exit!");
69+
}
70+
}
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+
}

‎concurrency/src/main/main.iml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,15 @@
77
</content>
88
<orderEntry type="inheritedJdk" />
99
<orderEntry type="sourceFolder" forTests="false" />
10+
<orderEntry type="module-library">
11+
<library name="JUnit4">
12+
<CLASSES>
13+
<root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.12/junit-4.12.jar!/" />
14+
<root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar!/" />
15+
</CLASSES>
16+
<JAVADOC />
17+
<SOURCES />
18+
</library>
19+
</orderEntry>
1020
</component>
1121
</module>

0 commit comments

Comments
(0)

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