ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/Mutex100M.java
Revision: 1.2
Committed: Mon May 9 19:33:30 2005 UTC (19 years ago) by dl
Branch: MAIN
Changes since 1.1: +5 -0 lines
Log Message:
Add headers

File Contents

# Content
1 /*
2 * Written by Doug Lea with assistance from members of JCP JSR-166
3 * Expert Group and released to the public domain, as explained at
4 * http://creativecommons.org/licenses/publicdomain
5 */
6
7 import java.util.concurrent.*;
8 import java.util.concurrent.atomic.*;
9 import java.util.concurrent.locks.*;
10
11 class Mutex100M {
12 public static void main(String[] args) throws Exception {
13 int x = loop((int)System.nanoTime(), 100000);
14 x = loop(x, 100000);
15 x = loop(x, 100000);
16 long start = System.nanoTime();
17 x = loop(x, 100000000);
18 if (x == 0) System.out.print(" ");
19 long time = System.nanoTime() - start;
20 double secs = (double)time / 1000000000.0;
21 System.out.println("time: " + secs);
22 start = System.nanoTime();
23 x = loop(x, 100000000);
24 if (x == 0) System.out.print(" ");
25 time = System.nanoTime() - start;
26 secs = (double)time / 1000000000.0;
27 System.out.println("time: " + secs);
28
29 }
30
31 static final Mutex100M.Mutex lock = new Mutex100M.Mutex();
32
33 static int loop(int x, int iters) {
34 final Mutex100M.Mutex l = lock;
35 for (int i = iters; i > 0; --i) {
36 l.lock();
37 x = x * 134775813 + 1;
38 l.unlock();
39 }
40 return x;
41 }
42
43
44 static final class Mutex extends AbstractQueuedSynchronizer {
45 public boolean isHeldExclusively() { return getState() == 1; }
46
47 public boolean tryAcquire(int acquires) {
48 return getState() == 0 && compareAndSetState(0, 1);
49 }
50
51 public boolean tryRelease(int releases) {
52 setState(0);
53 return true;
54 }
55 public Condition newCondition() { return new ConditionObject(); }
56
57 public void lock() {
58 if (!compareAndSetState(0, 1))
59 acquire(1);
60 }
61 public boolean tryLock() {
62 return tryAcquire(1);
63 }
64 public void lockInterruptibly() throws InterruptedException {
65 acquireInterruptibly(1);
66 }
67 public boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException {
68 return tryAcquireNanos(1, unit.toNanos(timeout));
69 }
70 public void unlock() { release(1); }
71 }
72
73 }