packagecom.thread.dome;2
3 importjava.util.Map;4 importjava.util.concurrent.ConcurrentHashMap;5 importjava.util.concurrent.ExecutorService;6 importjava.util.concurrent.Executors;7 importjava.util.concurrent.locks.ReentrantReadWriteLock;8
9 /**10 *
11 *@authorlx
12 * ReadWriteLock是jdk5中提供得读写分离锁。读写分离锁可以有效地帮助减少锁竞争,以提高系统性能。
13 * 在实际应用中,如果读操作次数远大于写操作,则读写锁就可以发挥最大得功效,提升系统性能。
14 * 读读不互斥:读读之间不阻塞 读写互斥:读阻写,写也会阻读 写写互斥:写写阻塞
15*/
16 //注:读写锁的效率比synchronized锁效率要高
17 public classReadAndWriteLockTest {18 ReentrantReadWriteLock lock = newReentrantReadWriteLock();19
20 volatile Map map = new ConcurrentHashMap();//用volatile修饰的ConcurrentHashMap保证在多线程之间的可见性
21
22 public static void main(String[] args) throwsException {23
24 final ReadAndWriteLockTest locks = newReadAndWriteLockTest();25
26 ExecutorService service1 =Executors.newCachedThreadPool();27 service1.execute(() ->{28 try{29locks.write();30 } catch(Exception e1) {31
32e1.printStackTrace();33}34 });//写操作;
35
36 ExecutorService service2 =Executors.newCachedThreadPool();37 service2.execute(() ->{38 try{39locks.reader();40 } catch(Exception e) {41 //TODO Auto-generated catch block
42e.printStackTrace();43}44 });//读操作
45
46}47
48 /**49 *
50 *@throwsException
51*/
52 public void write() throwsException {53 lock.writeLock().lock();//标识为写入锁
54
55 System.out.println("is reader:" +lock.isWriteLocked());56
57 try{58 for (int i = 0; i < 50; i++) {59map.put(String.valueOf(i), String.valueOf(i));60System.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 *@throwsException
76*/
77 public void reader() throwsException {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);87System.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 读完毕
最后
以上就是热情酸奶最近收集整理的关于java 单例 读写锁_Java多线程高并发(读写锁ReentrantReadWriteLock)的全部内容,更多相关java内容请搜索靠谱客的其他文章。
发表评论 取消回复