Java多线程高并发(读写锁ReentrantReadWriteLock)

 package com.thread.dome;
  2 
  3 import java.util.Map;
  4 import java.util.concurrent.ConcurrentHashMap;
  5 import java.util.concurrent.ExecutorService;
  6 import java.util.concurrent.Executors;
  7 import java.util.concurrent.locks.ReentrantReadWriteLock;
  8 
  9 /**
 10  * 
 11  * @author lx 
 12  * ReadWriteLock是jdk5中提供得读写分离锁。读写分离锁可以有效地帮助减少锁竞争,以提高系统性能。
 13  * 在实际应用中,如果读操作次数远大于写操作,则读写锁就可以发挥最大得功效,提升系统性能。
 14  * 读读不互斥:读读之间不阻塞 读写互斥:读阻写,写也会阻读 写写互斥:写写阻塞
 15  */
 16 // 注:读写锁的效率比synchronized锁效率要高
 17 public class ReadAndWriteLockTest {
 18     ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
 19 
 20     volatile Map map = new ConcurrentHashMap();// 用volatile修饰的ConcurrentHashMap保证在多线程之间的可见性
 21 
 22     public static void main(String[] args) throws Exception {
 23 
 24         final ReadAndWriteLockTest locks = new ReadAndWriteLockTest();
 25 
 26         ExecutorService service1 = Executors.newCachedThreadPool();
 27         service1.execute(() -> {
 28             try {
 29                 locks.write();
 30             } catch (Exception e1) {
 31 
 32                 e1.printStackTrace();
 33             }
 34         });// 写操作;
 35 
 36         ExecutorService service2 = Executors.newCachedThreadPool();
 37         service2.execute(() -> {
 38             try {
 39                 locks.reader();
 40             } catch (Exception e) {
 41                 // TODO Auto-generated catch block
 42                 e.printStackTrace();
 43             }
 44         });// 读操作
 45 
 46     }
 47 
 48     /**
 49      * 
 50      * @throws Exception
 51      */
 52     public void write() throws Exception {
 53         lock.writeLock().lock();// 标识为写入锁
 54 
 55         System.out.println("is reader:" + lock.isWriteLocked());
 56 
 57         try {
 58             for (int i = 0; i < 50; i++) {
 59                 map.put(String.valueOf(i), String.valueOf(i));
 60                 System.out.println(i);
 61                 System.out.println("正在写");
 62 
 63             }
 64         } catch (Exception e) {
 65             // TODO: handle exception
 66         } finally {
 67             System.out.println("写完毕");
 68             lock.writeLock().unlock();// 释放写入锁
 69         }
 70 
 71     }
 72 
 73     /**
 74      * 
 75      * @throws Exception
 76      */
 77     public void reader() throws Exception {
 78 
 79         lock.readLock().lock();// 标识为读取锁
 80 
 81         System.out.println("is reader:" + lock.isWriteLocked());
 82 
 83         Thread.sleep(1000);
 84         try {
 85             for (int i = 0; i < 50; i++) {
 86                 System.out.println("正在读:" + i);
 87                 System.out.println(map.get(String.valueOf(i)));
 88 
 89             }
 90         } catch (Exception e) {
 91             // TODO: handle exception
 92         } finally {
 93             System.out.println("读完毕");
 94             lock.readLock().unlock();// 释放度取锁
 95         }
 96 
 97     }
 98 
 99 }
100 
101 运行效果:
102 is reader:true
103 0
104 正在写
105 1
106 正在写
107 2
108 正在写
109 3
110 正在写
111 4
112 正在写
113 5
114 正在写
115 6
116 正在写
117 7
118 正在写
119 8
120 正在写
121 9
122 正在写
123 10
124 正在写
125 11
126 正在写
127 12
128 正在写
129 13
130 正在写
131 14
132 正在写
133 15
134 正在写
135 16
136 正在写
137 17
138 正在写
139 18
140 正在写
141 19
142 正在写
143 20
144 正在写
145 21
146 正在写
147 22
148 正在写
149 23
150 正在写
151 24
152 正在写
153 25
154 正在写
155 26
156 正在写
157 27
158 正在写
159 28
160 正在写
161 29
162 正在写
163 30
164 正在写
165 31
166 正在写
167 32
168 正在写
169 33
170 正在写
171 34
172 正在写
173 35
174 正在写
175 36
176 正在写
177 37
178 正在写
179 38
180 正在写
181 39
182 正在写
183 40
184 正在写
185 41
186 正在写
187 42
188 正在写
189 43
190 正在写
191 44
192 正在写
193 45
194 正在写
195 46
196 正在写
197 47
198 正在写
199 48
200 正在写
201 49
202 正在写
203 写完毕
204 is reader:false
205 正在读:0
206 0
207 正在读:1
208 1
209 正在读:2
210 2
211 正在读:3
212 3
213 正在读:4
214 4
215 正在读:5
216 5
217 正在读:6
218 6
219 正在读:7
220 7
221 正在读:8
222 8
223 正在读:9
224 9
225 正在读:10
226 10
227 正在读:11
228 11
229 正在读:12
230 12
231 正在读:13
232 13
233 正在读:14
234 14
235 正在读:15
236 15
237 正在读:16
238 16
239 正在读:17
240 17
241 正在读:18
242 18
243 正在读:19
244 19
245 正在读:20
246 20
247 正在读:21
248 21
249 正在读:22
250 22
251 正在读:23
252 23
253 正在读:24
254 24
255 正在读:25
256 25
257 正在读:26
258 26
259 正在读:27
260 27
261 正在读:28
262 28
263 正在读:29
264 29
265 正在读:30
266 30
267 正在读:31
268 31
269 正在读:32
270 32
271 正在读:33
272 33
273 正在读:34
274 34
275 正在读:35
276 35
277 正在读:36
278 36
279 正在读:37
280 37
281 正在读:38
282 38
283 正在读:39
284 39
285 正在读:40
286 40
287 正在读:41
288 41
289 正在读:42
290 42
291 正在读:43
292 43
293 正在读:44
294 44
295 正在读:45
296 45
297 正在读:46
298 46
299 正在读:47
300 47
301 正在读:48
302 48
303 正在读:49
304 49
305 读完毕

 

转载于:https://www.cnblogs.com/mature1021/p/9493219.html

你可能感兴趣的:(Java多线程高并发(读写锁ReentrantReadWriteLock))