读写锁: 读读可以共存 读写不能共存 写写不能共存 独占锁(写锁) 共享锁(读锁)
public class ReadWriteLockTest {
public static void main ( String[ ] args) {
MyCache myCache = new MyCache ( ) ;
for ( int i = 1 ; i <= 5 ; i++ ) {
final int temp = i;
new Thread ( ( ) - > {
myCache. put ( temp+ "" , temp+ "" ) ;
} , String. valueOf ( i) ) . start ( ) ;
}
for ( int i = 1 ; i <= 5 ; i++ ) {
final int temp = i;
new Thread ( ( ) - > {
myCache. get ( temp+ "" ) ;
} , String. valueOf ( i) ) . start ( ) ;
}
}
}
class MyCache {
private volatile Map< String, Object> map = new HashMap < > ( ) ;
private ReadWriteLock readWriteLock = new ReentrantReadWriteLock ( ) ;
public void put ( String key, Object value) {
readWriteLock. writeLock ( ) . lock ( ) ;
try {
System. out. println ( Thread. currentThread ( ) . getName ( ) + "写入" + key) ;
map. put ( key, value) ;
System. out. println ( Thread. currentThread ( ) . getName ( ) + "写入ok" ) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
} finally {
readWriteLock. writeLock ( ) . unlock ( ) ;
}
}
public void get ( String key) {
readWriteLock. readLock ( ) . lock ( ) ;
try {
System. out. println ( Thread. currentThread ( ) . getName ( ) + "读取" + key) ;
Object o = map. get ( key) ;
System. out. println ( Thread. currentThread ( ) . getName ( ) + "读取ok" ) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
} finally {
readWriteLock. readLock ( ) . unlock ( ) ;
}
}
}