zoukankan      html  css  js  c++  java
  • 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 读完毕
  • 相关阅读:
    Python爬虫初识
    使用Hexo和Github Pages快速搭建个人博客
    jQuery Grid入门指南(2)
    jQuery Grid入门指南(1)
    实习小结(五)--- SSM框架搭建(Maven项目)
    win10开机就占用了50%内存,win10越用越卡
    项目导入The type java.lang.String cannot be resolved. It is indirectly referenced from required is indirectly referenced fr
    eclipse中src以文件夹形式展示,没有以package包形式展示
    Unexpected exception parsing XML document from file [F:meideerpinterfacewebWEB-INFclassesspringspring.xml]; nested exception is java.lang.UnsupportedClassVersionError: Bad version number in .cl
    oracle数据导入dmp
  • 原文地址:https://www.cnblogs.com/mature1021/p/9493219.html
Copyright © 2011-2022 走看看