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; }