---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------
在java多线程中,为了提高效率有些共享资源允许同时进行多个读的操作,但只允许一个写的操作,比如一个文件,只要其内容不变可以让多个线程同时读,不必做排他的锁定,排他的锁定只有在写的时候需要,以保证别的线程不会看到数据不完整的文件。
什么是读写锁(在读的方法上加读锁,在写的方法上加写锁):
分为读书与写锁,多个读锁不互斥,读锁与写锁互斥,写锁与写锁互斥
class Output2{
private ReentrantReadWriteLock lock=new ReentrantReadWriteLock();//创建读写锁,虚拟机会自动会为我们实习读锁与读锁不互斥,写锁与写锁互斥,读锁与写锁互斥
private void read(){
lock.readLock().lock();//读的方法加读锁
try {
Thread.sleep(200);
System.out.println("be readly to read the data");
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
lock.readLock().unlock();
}
}
private void write(){
lock.writeLock().lock();//写的方法加读锁
try {
Thread.sleep(200);
System.out.println("be readly to write the data");
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
lock.writeLock().unlock();
}
}
}
模拟缓存系统
//模拟缓存系统
class MyCache{
private ReentrantReadWriteLock lock=new ReentrantReadWriteLock();
private Map<String, Object> cache=new HashMap<String, Object>();
public Object getDate(String key){
lock.readLock().lock();//整的加读锁,提高系统性能
Object ob=cache.get(key);
try{
if(ob==null){//如果发现数据不存在,则解除读锁,加写锁
lock.readLock().unlock();
lock.writeLock().lock();
try{
if(ob==null){//防止多个读锁多次加载数据
ob="abc";//模拟数据库查询
}
}catch (Exception e) {
// TODO: handle exception
}finally{
lock.writeLock().unlock();//加载完数据后,则解除写锁,加读锁
}
}
lock.readLock().lock();
}catch (Exception e) {
}finally{
lock.readLock().unlock();
}
return ob;
}
}
---------------------- ASP.Net+Android+IOS开发、 .Net培训、期待与您交流! ----------------------