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<String, String> map = new ConcurrentHashMap<String, String>();// 用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 读完毕
相关文章
相关标签/搜索