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 读完毕