Java多线程编程中线程锁与读写锁的使用示例
线程锁Lock
Lock 相当于当前对象的Synchronized
importjava.util.concurrent.locks.Lock;
importjava.util.concurrent.locks.ReentrantLock;
/*
*Locklock=newReentrantLock();
*lock.lock();lock.unLock();
*类似于synchronized,但不能与synchronized混用
*/
publicclassLockTest{
publicstaticvoidmain(String[]args){
finalOuterouter=newLockTest().newOuter();
newThread(newRunnable(){
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
while(true){
outer.out1("zhangxiaoxiao");
outer.out2("lihuoming");
}
}
}).start();
newThread(newRunnable(){
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
while(true){
outer.out1("zhangxiaoxiao");
outer.out2("lihuoming");
}
}
}).start();
}
classOuter{
Locklock=newReentrantLock();
voidout1(Stringname){
lock.lock();
intlen=name.length();
for(inti=0;i<len;i++){
System.out.print(name.charAt(i));
}
System.out.println();
lock.unlock();
}
voidout2(Stringname){
lock.lock();
intlen=name.length();
for(inti=0;i<len;i++){
System.out.print(name.charAt(i));
}
System.out.println();
lock.unlock();
}
}
}
读写锁ReentrantReadWriteLock
读写锁:允许多条线程同时读;不能读中有写;不能写中有读;不能写中有写
importjava.util.HashMap;
importjava.util.Map;
importjava.util.concurrent.locks.ReadWriteLock;
importjava.util.concurrent.locks.ReentrantReadWriteLock;
/*
*问题:设计一个缓存机制的伪代码
*从集合中读取数据,读取不到,就写入,再考虑多线程并发的情况
*/
publicclassReadWriteLockTest2{
privateMap<String,Object>data=newHashMap<String,Object>();
privateReadWriteLocklock=newReentrantReadWriteLock();
//读写锁
publicObjectgetInstance1(Stringkey,Objectobj){
lock.readLock().lock();
Objectvalue=null;
try{
value=data.get(key);
if(value==null){//一条线程进入这里,
lock.readLock().unlock();//读锁解了,其他线程就可能也到这了
lock.writeLock().lock();//只能有一条线程到这,写锁开启,要写入数据了
if(data.get(key)==null){
value=obj;
/*先判断数据,如果不存在,才写入,,因为界时当写锁解除后,其他
线程,再想写入时,判断到数据存在,就跳过了。就不会发生同时写入的情况
*/
data.put(key,value);
}
lock.writeLock().unlock();//写完了,解锁
lock.readLock().lock();
}
}finally{
lock.readLock().unlock();
}
returnvalue;
}