ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/ReadHoldingWriteLock.java
Revision: 1.5
Committed: Tue Mar 15 19:47:05 2011 UTC (13 years, 1 month ago) by jsr166
Branch: MAIN
CVS Tags: release-1_7_0
Changes since 1.4: +1 -1 lines
Log Message:
Update Creative Commons license URL in legal notices

File Contents

# User Rev Content
1 dl 1.2 /*
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 jsr166 1.5 * http://creativecommons.org/publicdomain/zero/1.0/
5 dl 1.2 */
6 dl 1.1 import java.util.concurrent.locks.*;
7    
8     class ReadHoldingWriteLock {
9    
10     public static void main(String[] args) throws Exception {
11     ReadHoldingWriteLock t = new ReadHoldingWriteLock();
12     t.testReadAfterWriteLock();
13     t.testReadHoldingWriteLock();
14     t.testReadHoldingWriteLock2();
15     t.testReadHoldingWriteLockFair();
16     t.testReadHoldingWriteLockFair2();
17     }
18    
19     static final long SHORT_DELAY_MS = 50;
20     static final long MEDIUM_DELAY_MS = 200;
21    
22     void assertTrue(boolean b) {
23     if (!b) throw new Error();
24     }
25    
26     /**
27     * Readlocks succeed after a writing thread unlocks
28     */
29 jsr166 1.3 public void testReadAfterWriteLock() throws Exception {
30 jsr166 1.4 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
31     lock.writeLock().lock();
32     Thread t1 = new Thread(new Runnable() {
33 dl 1.1 public void run() {
34     lock.readLock().lock();
35     lock.readLock().unlock();
36 jsr166 1.4 }
37     });
38     Thread t2 = new Thread(new Runnable() {
39 dl 1.1 public void run() {
40     lock.readLock().lock();
41     lock.readLock().unlock();
42 jsr166 1.4 }
43     });
44 dl 1.1
45     t1.start();
46     t2.start();
47     Thread.sleep(SHORT_DELAY_MS);
48     lock.writeLock().unlock();
49     t1.join(MEDIUM_DELAY_MS);
50     t2.join(MEDIUM_DELAY_MS);
51     assertTrue(!t1.isAlive());
52     assertTrue(!t2.isAlive());
53 jsr166 1.3
54     }
55 dl 1.1
56     /**
57     * Read trylock succeeds if write locked by current thread
58     */
59 jsr166 1.3 public void testReadHoldingWriteLock()throws Exception {
60 jsr166 1.4 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
61     lock.writeLock().lock();
62 dl 1.1 assertTrue(lock.readLock().tryLock());
63     lock.readLock().unlock();
64     lock.writeLock().unlock();
65 jsr166 1.3 }
66 dl 1.1
67     /**
68     * Read lock succeeds if write locked by current thread even if
69     * other threads are waiting
70     */
71 jsr166 1.3 public void testReadHoldingWriteLock2() throws Exception{
72 jsr166 1.4 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
73     lock.writeLock().lock();
74     Thread t1 = new Thread(new Runnable() {
75 dl 1.1 public void run() {
76     lock.readLock().lock();
77     lock.readLock().unlock();
78 jsr166 1.4 }
79     });
80     Thread t2 = new Thread(new Runnable() {
81 dl 1.1 public void run() {
82     lock.readLock().lock();
83     lock.readLock().unlock();
84 jsr166 1.4 }
85     });
86 jsr166 1.3
87 dl 1.1 t1.start();
88     t2.start();
89     lock.readLock().lock();
90     lock.readLock().unlock();
91     Thread.sleep(SHORT_DELAY_MS);
92     lock.readLock().lock();
93     lock.readLock().unlock();
94     lock.writeLock().unlock();
95     t1.join(MEDIUM_DELAY_MS);
96     t2.join(MEDIUM_DELAY_MS);
97     assertTrue(!t1.isAlive());
98     assertTrue(!t2.isAlive());
99 jsr166 1.3 }
100 dl 1.1
101     /**
102     * Fair Read trylock succeeds if write locked by current thread
103     */
104 jsr166 1.3 public void testReadHoldingWriteLockFair() throws Exception{
105 jsr166 1.4 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
106     lock.writeLock().lock();
107 dl 1.1 assertTrue(lock.readLock().tryLock());
108     lock.readLock().unlock();
109     lock.writeLock().unlock();
110 jsr166 1.3 }
111 dl 1.1
112     /**
113     * Fair Read lock succeeds if write locked by current thread even if
114     * other threads are waiting
115     */
116 jsr166 1.3 public void testReadHoldingWriteLockFair2() throws Exception {
117 jsr166 1.4 final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true);
118     lock.writeLock().lock();
119     Thread t1 = new Thread(new Runnable() {
120 dl 1.1 public void run() {
121     lock.readLock().lock();
122     lock.readLock().unlock();
123 jsr166 1.4 }
124     });
125     Thread t2 = new Thread(new Runnable() {
126 dl 1.1 public void run() {
127     lock.readLock().lock();
128     lock.readLock().unlock();
129 jsr166 1.4 }
130     });
131 dl 1.1
132     t1.start();
133     t2.start();
134     lock.readLock().lock();
135     lock.readLock().unlock();
136     Thread.sleep(SHORT_DELAY_MS);
137     lock.readLock().lock();
138     lock.readLock().unlock();
139     lock.writeLock().unlock();
140     t1.join(MEDIUM_DELAY_MS);
141     t2.join(MEDIUM_DELAY_MS);
142     assertTrue(!t1.isAlive());
143     assertTrue(!t2.isAlive());
144    
145 jsr166 1.3
146     }
147 dl 1.1 }