zoukankan      html  css  js  c++  java
  • JDK 5.0 Concurrency Utilities 并发处理(3)ReadWriteLock 读写锁

    ReadWriteLock 读写锁

     

     

      1package com.vinko.test.concurrent;
      2
      3import java.util.Calendar;
      4import java.util.Map;
      5import java.util.TreeMap;
      6//import java.util.concurrent.locks.Condition;
      7import java.util.concurrent.locks.Lock;
      8import java.util.concurrent.locks.ReentrantReadWriteLock;
      9
     10public class TestReadWriteLock {
     11    
     12    private ReentrantReadWriteLock lock = null;
     13    
     14    private Lock readLock = null;
     15    private Lock writeLock = null;
     16    
     17//    private Condition condition = null;
     18    
     19    public int key = 100;
     20    public int index = 100;
     21    
     22    public Map<Integer, String> dataMap = null;
     23    
     24    public TestReadWriteLock() {
     25        lock = new ReentrantReadWriteLock(true);
     26        
     27        readLock = lock.readLock();
     28        writeLock = lock.writeLock();
     29        
     30//        condition = writeLock.newCondition();
     31        
     32        dataMap = new TreeMap<Integer, String>();
     33    }

     34    
     35    /**
     36     * @param args
     37     */

     38    public static void main(String[] args) {
     39    
     40        TestReadWriteLock tester = new TestReadWriteLock();
     41
     42        // test lock downgrading
     43        
     44//        tester.readLock.lock();
     45//        System.out.println(Thread.currentThread() + " get readLock");
     46
     47        tester.writeLock.lock();
     48        System.out.println(Thread.currentThread() + " get writeLock.");
     49
     50        tester.writeLock.lock();
     51        System.out.println(Thread.currentThread() + " get writeLock.");
     52
     53        tester.readLock.lock();
     54        System.out.println(Thread.currentThread() + " get readLock");
     55
     56        tester.readLock.lock();
     57        System.out.println(Thread.currentThread() + " get readLock");
     58        
     59//        tester.writeLock.lock();
     60//        System.out.println(Thread.currentThread() + " get writeLock.");
     61
     62        tester.readLock.unlock();
     63        tester.readLock.unlock();
     64        tester.writeLock.unlock();
     65        tester.writeLock.unlock();
     66        
     67        tester.test();
     68    }

     69    
     70    public void test() {
     71
     72        for (int i = 0; i < 10; i++{
     73            new Thread(new reader(this)).start();
     74        }

     75        
     76        for (int i = 0; i <3; i++{
     77            new Thread(new writer(this)).start();
     78        }

     79
     80    }

     81
     82    public void read() {
     83/*        
     84        writeLock.lock();
     85        
     86        try {
     87            condition.await();
     88        } catch (InterruptedException e1) {
     89            e1.printStackTrace();
     90        }
     91        
     92        writeLock.unlock();
     93*/

     94        readLock.lock();
     95        
     96        try {
     97            if (dataMap.isEmpty()) {
     98                Calendar now = Calendar.getInstance();
     99                System.out.println(now.getTime() + " R " + Thread.currentThread() + " get key, but map is empty.");
    100            }

    101            
    102            String value = dataMap.get(index);
    103
    104            Calendar now = Calendar.getInstance();
    105            System.out.println(now.getTime() + " R " + Thread.currentThread() + " get key = " + index + " value = " + value + " map size = " + dataMap.size());
    106            
    107            // get next value
    108            if (value != null{
    109                index ++;
    110            }

    111        }
     finally {
    112            readLock.unlock();
    113        }

    114
    115        try {
    116            Thread.sleep(3000);
    117        }
     catch (InterruptedException e) {
    118            e.printStackTrace();
    119        }

    120    }

    121    
    122    public void write() {
    123        
    124        writeLock.lock();
    125        
    126        
    127        try {
    128            String value = "value" + key;
    129            
    130            dataMap.put(new Integer(key), value);
    131            
    132            Calendar now = Calendar.getInstance();
    133            System.out.println(now.getTime() + " W " + Thread.currentThread() + " put key = " + key + " value = " + value + " map size = " + dataMap.size());
    134            
    135            key ++;
    136        
    137//            condition.signal();
    138            
    139            try {
    140                Thread.sleep(500);
    141            }
     catch (InterruptedException e) {
    142                e.printStackTrace();
    143            }

    144
    145        }
     finally {
    146            writeLock.unlock();
    147        }

    148
    149    }

    150}

    151
    152class reader implements Runnable {
    153    
    154    private TestReadWriteLock tester = null;
    155    
    156    public reader(TestReadWriteLock tester) {
    157        this.tester = tester;
    158    }

    159    
    160    public void run() {
    161        Calendar now = Calendar.getInstance();
    162        
    163        System.out.println(now.getTime() + " R " + Thread.currentThread() + " started");
    164        
    165        while (true{
    166            tester.read();
    167        }

    168    }

    169}

    170
    171class writer implements Runnable {
    172    
    173    private TestReadWriteLock tester = null;
    174    
    175    public writer(TestReadWriteLock tester) {
    176        this.tester = tester;
    177    }

    178    
    179    public void run() {
    180        Calendar now = Calendar.getInstance();
    181        
    182        System.out.println(now.getTime() + " W " + Thread.currentThread() + " started");
    183        
    184        while (true{
    185            tester.write();
    186        }

    187    }

    188}
  • 相关阅读:
    Codeforces Round #625 (Div. 2, based on Technocup 2020 Final Round)(A-C题解)
    最小生成树
    并查集
    字符串的匹配算法
    CTU Open Contest 2019 AB题
    Codeforces Round #624 (Div. 3)(题解)
    Educational Codeforces Round 53 (Rated for Div. 2) (前五题题解)
    Lyft Level 5 Challenge 2018
    终于在博客写完第一篇题解啦
    Codeforces Round #519 by Botan Investments(前五题题解)
  • 原文地址:https://www.cnblogs.com/kylindai/p/322667.html
Copyright © 2011-2022 走看看