java 并发读写_Java多线程高并发(读写锁ReentrantReadWriteLock)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值