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 讀完畢
相關文章
相關標籤/搜索