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 讀完畢