共享的数据,只能有一个线程可以写该数据,但可以有个多个线程同时读该数据
Lock比传统的线程中的synchronized方式更面向对象。两个线程执行的代码要实现同步互斥,他们必须用同一个Lock对象,锁加在类的内部方法中,而不是线程代码中。
读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,写锁与写锁互斥
package thread;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;public class CacheDemo {
private Map<String,Object> cache=new HashMap<String,Object>();
private ReadWriteLock lock=new ReentrantReadWriteLock();
public Object getData(String key){
//添加读锁,读锁运行多个线程同时进入(多人同时读)
lock.readLock().lock();
Object value=null;
try {
value=cache.get(key);
if(value==null){
//如果没有数据库时,释放读锁,并且添加写锁
lock.readLock().unlock();
//此时,同一时刻,只能有一个线程写数据,其他线程阻塞
lock.writeLock().lock();
try {
//第一个线程写完释放写锁后,有可能第二个线程进来再写,所以再判断一次
if(value==null){
value="去查询数据库";//此处去查询数据库
}
}finally{
//释放写锁
lock.writeLock().unlock();
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//释放读锁
lock.readLock().unlock();
}
return value;
}
}