/**
* 测试独占
*/publicclassTestExclusive{publicstaticvoidmain(String[] args){
MyCache cache =newMyCache();for(int i =0; i <5; i++){finalint num = i;newThread(()->{
cache.put(String.valueOf(num),num);},String.valueOf(num)).start();}for(int i =0; i <5; i++){finalint num = i;newThread(()->{
cache.get(String.valueOf(num));},String.valueOf(num)).start();}}}classMyCache{privatevolatile Map<String,Object> map =newHashMap<>();publicvoidput(String key, Object value){
System.out.println(Thread.currentThread().getName()+" start put .....");
map.put(key,value);
System.out.println(Thread.currentThread().getName()+" end put .....");}publicvoidget(String key){
System.out.println(Thread.currentThread().getName()+" start get .....");
Object result = map.get(key);
System.out.println(Thread.currentThread().getName()+" end get....."+ result);}}/**
3 start put .....
4 start put .....
4 end put .....
2 start put .....
0 start put .....
0 end put .....
1 start put .....
2 end put .....
3 end put .....
1 end put .....
0 start get .....
1 start get .....
0 end get.....0
2 start get .....
1 end get.....1
4 start get .....
3 start get .....
2 end get.....2
3 end get.....3
4 end get.....4
*/
解决问题
publicclassTestExclusive{publicstaticvoidmain(String[] args){
MyCache cache =newMyCache();for(int i =0; i <5; i++){finalint num = i;newThread(()->{
cache.put(String.valueOf(num),num);},String.valueOf(num)).start();}for(int i =0; i <5; i++){finalint num = i;newThread(()->{
cache.get(String.valueOf(num));},String.valueOf(num)).start();}}}classMyCache{privatevolatile Map<String,Object> map =newHashMap<>();private ReentrantReadWriteLock rwLock =newReentrantReadWriteLock();publicvoidput(String key, Object value){
rwLock.writeLock().lock();try{
System.out.println(Thread.currentThread().getName()+" start put .....");
map.put(key,value);
System.out.println(Thread.currentThread().getName()+" end put .....");}finally{
rwLock.writeLock().unlock();}}publicvoidget(String key){
rwLock.readLock().lock();try{
System.out.println(Thread.currentThread().getName()+" start get .....");
Object result = map.get(key);
System.out.println(Thread.currentThread().getName()+" end get....."+ result);}finally{
rwLock.readLock().unlock();}}}/**
* 0 start put .....
* 0 end put .....
* 2 start put .....
* 2 end put .....
* 1 start put .....
* 1 end put .....
* 3 start put .....
* 3 end put .....
* 4 start put .....
* 4 end put .....
* 0 start get .....
* 0 end get.....0
* 4 start get .....
* 2 start get .....
* 1 start get .....
* 2 end get.....2
* 3 start get .....
* 4 end get.....4
* 3 end get.....3
* 1 end get.....1
* */