Java Program : Reader Writer Problem
Java Program : Reader Writer Problem
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
package com.lp2; import java.lang.Thread; import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.ReentrantReadWriteLock; public class ReaderWriterProblem { private Map sharedMap = new HashMap(); private ReentrantReadWriteLock theLock = new ReentrantReadWriteLock(true); public static void main(String[] args) { ReaderWriterProblem rwObj = new ReaderWriterProblem(); rwObj.initializeTesting(); } public ReaderWriterProblem() { sharedMap.put("Variable1", "A"); sharedMap.put("Variable2", "B"); sharedMap.put("Variable3", "C"); } private void initializeTesting() { SharedMapReader reader1 = new SharedMapReader("01", "Variable1"); SharedMapReader reader2 = new SharedMapReader("02", "Variable2"); SharedMapReader reader3 = new SharedMapReader("03", "Variable3"); SharedMapReader reader4 = new SharedMapReader("04", "Variable1"); SharedMapReader reader5 = new SharedMapReader("05", "Variable2"); SharedMapReader reader6 = new SharedMapReader("06", "Variable3"); SharedMapReader reader7 = new SharedMapReader("07", "Variable1"); SharedMapReader reader8 = new SharedMapReader("08", "Variable3"); SharedMapReader reader9 = new SharedMapReader("09", "Variable1"); SharedMapReader reader10 = new SharedMapReader("10", "Variable2"); SharedMapReader reader11 = new SharedMapReader("11", "Variable3"); SharedMapReader reader12 = new SharedMapReader("12", "Variable1"); SharedMapWriter writer1 = new SharedMapWriter("01", "Variable1", "X"); SharedMapWriter writer2 = new SharedMapWriter("02", "Variable2", "Y"); SharedMapWriter writer3 = new SharedMapWriter("03", "Variable3", "Z"); new Thread(reader1).start(); new Thread(reader10).start(); new Thread(writer1).start(); new Thread(reader2).start(); new Thread(reader3).start(); new Thread(reader8).start(); new Thread(reader9).start(); new Thread(writer2).start(); new Thread(reader11).start(); new Thread(reader4).start(); new Thread(writer3).start(); new Thread(reader5).start(); new Thread(reader6).start(); new Thread(reader7).start(); new Thread(reader12).start(); } private class SharedMapReader implements Runnable { private String name; private String key; public SharedMapReader(String theName, String theKey) { name = theName; key = theKey; } public void run() { try { theLock.readLock().lock(); String value = (String) sharedMap.get(key); System.out.println("#### The Reader " + name + " has read " + key + " and value is " + value); try { Thread.sleep(2000); } catch (InterruptedException e) { } } finally { theLock.readLock().unlock(); } } } private class SharedMapWriter implements Runnable { private String name; private String key; private String value; public SharedMapWriter(String theName, String theKey, String theValue) { name = theName; key = theKey; value = theValue; } public void run() { try { theLock.writeLock().lock(); sharedMap.put(key, value); System.out.println("@@@@ The Writer " + name + " has written " + key + " value is " + value); try { Thread.sleep(4000); } catch (InterruptedException e) { } } finally { theLock.writeLock().unlock(); } } } } |
Output :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#### The Reader 01 has read Variable1 and value is A #### The Reader 10 has read Variable2 and value is B @@@@ The Writer 01 has written Variable1 value is X #### The Reader 02 has read Variable2 and value is B #### The Reader 03 has read Variable3 and value is C #### The Reader 11 has read Variable3 and value is C #### The Reader 08 has read Variable3 and value is C @@@@ The Writer 02 has written Variable2 value is Y #### The Reader 09 has read Variable1 and value is X #### The Reader 04 has read Variable1 and value is X @@@@ The Writer 03 has written Variable3 value is Z #### The Reader 05 has read Variable2 and value is Y #### The Reader 07 has read Variable1 and value is X #### The Reader 12 has read Variable1 and value is X #### The Reader 06 has read Variable3 and value is Z |
Explanation :
In this program we have created the shared map -
1 |
private Map sharedMap = new HashMap(); |
and we have created an object of type ReentrantReadWriteLock for creating the lock.
1 |
private ReentrantReadWriteLock theLock = new ReentrantReadWriteLock(true); |
Re-commanded Article : Click here to read more about ReentrantReadWriteLock lock
We also need some readers those can read the shared map and some writers who can write on the map.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
SharedMapReader reader1 = new SharedMapReader("01", "Variable1"); SharedMapReader reader2 = new SharedMapReader("02", "Variable2"); SharedMapReader reader3 = new SharedMapReader("03", "Variable3"); SharedMapReader reader4 = new SharedMapReader("04", "Variable1"); SharedMapReader reader5 = new SharedMapReader("05", "Variable2"); SharedMapReader reader6 = new SharedMapReader("06", "Variable3"); SharedMapReader reader7 = new SharedMapReader("07", "Variable1"); SharedMapReader reader8 = new SharedMapReader("08", "Variable3"); SharedMapReader reader9 = new SharedMapReader("09", "Variable1"); SharedMapReader reader10 = new SharedMapReader("10", "Variable2"); SharedMapReader reader11 = new SharedMapReader("11", "Variable3"); SharedMapReader reader12 = new SharedMapReader("12", "Variable1"); SharedMapWriter writer1 = new SharedMapWriter("01", "Variable1", "X"); SharedMapWriter writer2 = new SharedMapWriter("02", "Variable2", "Y"); SharedMapWriter writer3 = new SharedMapWriter("03", "Variable3", "Z"); |
Now after this basic setup we can start the reader writer program.