浅谈多线程中的锁的几种用法总结(必看)
一、ReentrantLock
packagecom.ietree.basicskill.mutilthread.lock; importjava.util.concurrent.locks.Lock; importjava.util.concurrent.locks.ReentrantLock; /** *CreatedbyAdministratoron2017/5/17. */ publicclassUseReentrantLock{ privateLocklock=newReentrantLock(); publicvoidmethod1(){ try{ lock.lock(); System.out.println("当前线程:"+Thread.currentThread().getName()+"进入method1.."); Thread.sleep(1000); System.out.println("当前线程:"+Thread.currentThread().getName()+"退出method1.."); Thread.sleep(1000); }catch(InterruptedExceptione){ e.printStackTrace(); }finally{ lock.unlock(); } } publicvoidmethod2(){ try{ lock.lock(); System.out.println("当前线程:"+Thread.currentThread().getName()+"进入method2.."); Thread.sleep(2000); System.out.println("当前线程:"+Thread.currentThread().getName()+"退出method2.."); Thread.sleep(1000); }catch(InterruptedExceptione){ e.printStackTrace(); }finally{ lock.unlock(); } } publicstaticvoidmain(String[]args){ finalUseReentrantLockur=newUseReentrantLock(); Threadt1=newThread(newRunnable(){ @Override publicvoidrun(){ ur.method1(); ur.method2(); } },"t1"); t1.start(); try{ Thread.sleep(10); }catch(InterruptedExceptione){ e.printStackTrace(); } //System.out.println(ur.lock.getQueueLength()); } }
二、ReentrantReadWriteLock
packagecom.ietree.basicskill.mutilthread.lock; importjava.util.concurrent.locks.ReentrantReadWriteLock; /** *CreatedbyAdministratoron2017/5/17. */ publicclassUseReentrantReadWriteLock{ privateReentrantReadWriteLockrwLock=newReentrantReadWriteLock(); privateReentrantReadWriteLock.ReadLockreadLock=rwLock.readLock(); privateReentrantReadWriteLock.WriteLockwriteLock=rwLock.writeLock(); publicvoidread(){ try{ readLock.lock(); System.out.println("当前线程:"+Thread.currentThread().getName()+"进入..."); Thread.sleep(3000); System.out.println("当前线程:"+Thread.currentThread().getName()+"退出..."); }catch(Exceptione){ e.printStackTrace(); }finally{ readLock.unlock(); } } publicvoidwrite(){ try{ writeLock.lock(); System.out.println("当前线程:"+Thread.currentThread().getName()+"进入..."); Thread.sleep(3000); System.out.println("当前线程:"+Thread.currentThread().getName()+"退出..."); }catch(Exceptione){ e.printStackTrace(); }finally{ writeLock.unlock(); } } publicstaticvoidmain(String[]args){ finalUseReentrantReadWriteLockurrw=newUseReentrantReadWriteLock(); Threadt1=newThread(newRunnable(){ @Override publicvoidrun(){ urrw.read(); } },"t1"); Threadt2=newThread(newRunnable(){ @Override publicvoidrun(){ urrw.read(); } },"t2"); Threadt3=newThread(newRunnable(){ @Override publicvoidrun(){ urrw.write(); } },"t3"); Threadt4=newThread(newRunnable(){ @Override publicvoidrun(){ urrw.write(); } },"t4"); //t1.start(); //t2.start(); //t1.start();//R //t3.start();//W t3.start(); t4.start(); } }
三、Condition
packagecom.ietree.basicskill.mutilthread.lock; importjava.util.concurrent.locks.Condition; importjava.util.concurrent.locks.Lock; importjava.util.concurrent.locks.ReentrantLock; /** *CreatedbyAdministratoron2017/5/17. */ publicclassUseCondition{ privateLocklock=newReentrantLock(); privateConditioncondition=lock.newCondition(); publicvoidmethod1(){ try{ lock.lock(); System.out.println("当前线程:"+Thread.currentThread().getName()+"进入等待状态.."); Thread.sleep(3000); System.out.println("当前线程:"+Thread.currentThread().getName()+"释放锁.."); condition.await();//Objectwait System.out.println("当前线程:"+Thread.currentThread().getName()+"继续执行..."); }catch(Exceptione){ e.printStackTrace(); }finally{ lock.unlock(); } } publicvoidmethod2(){ try{ lock.lock(); System.out.println("当前线程:"+Thread.currentThread().getName()+"进入.."); Thread.sleep(3000); System.out.println("当前线程:"+Thread.currentThread().getName()+"发出唤醒.."); condition.signal();//Objectnotify }catch(Exceptione){ e.printStackTrace(); }finally{ lock.unlock(); } } publicstaticvoidmain(String[]args){ finalUseConditionuc=newUseCondition(); Threadt1=newThread(newRunnable(){ @Override publicvoidrun(){ uc.method1(); } },"t1"); Threadt2=newThread(newRunnable(){ @Override publicvoidrun(){ uc.method2(); } },"t2"); t1.start(); t2.start(); } }
四、ManyCondition
packagecom.ietree.basicskill.mutilthread.lock; importjava.util.concurrent.locks.Condition; importjava.util.concurrent.locks.ReentrantLock; /** *CreatedbyAdministratoron2017/5/17. */ publicclassUseManyCondition{ privateReentrantLocklock=newReentrantLock(); privateConditionc1=lock.newCondition(); privateConditionc2=lock.newCondition(); publicvoidm1(){ try{ lock.lock(); System.out.println("当前线程:"+Thread.currentThread().getName()+"进入方法m1等待.."); c1.await(); System.out.println("当前线程:"+Thread.currentThread().getName()+"方法m1继续.."); }catch(Exceptione){ e.printStackTrace(); }finally{ lock.unlock(); } } publicvoidm2(){ try{ lock.lock(); System.out.println("当前线程:"+Thread.currentThread().getName()+"进入方法m2等待.."); c1.await(); System.out.println("当前线程:"+Thread.currentThread().getName()+"方法m2继续.."); }catch(Exceptione){ e.printStackTrace(); }finally{ lock.unlock(); } } publicvoidm3(){ try{ lock.lock(); System.out.println("当前线程:"+Thread.currentThread().getName()+"进入方法m3等待.."); c2.await(); System.out.println("当前线程:"+Thread.currentThread().getName()+"方法m3继续.."); }catch(Exceptione){ e.printStackTrace(); }finally{ lock.unlock(); } } publicvoidm4(){ try{ lock.lock(); System.out.println("当前线程:"+Thread.currentThread().getName()+"唤醒.."); c1.signalAll(); }catch(Exceptione){ e.printStackTrace(); }finally{ lock.unlock(); } } publicvoidm5(){ try{ lock.lock(); System.out.println("当前线程:"+Thread.currentThread().getName()+"唤醒.."); c2.signal(); }catch(Exceptione){ e.printStackTrace(); }finally{ lock.unlock(); } } publicstaticvoidmain(String[]args){ finalUseManyConditionumc=newUseManyCondition(); Threadt1=newThread(newRunnable(){ @Override publicvoidrun(){ umc.m1(); } },"t1"); Threadt2=newThread(newRunnable(){ @Override publicvoidrun(){ umc.m2(); } },"t2"); Threadt3=newThread(newRunnable(){ @Override publicvoidrun(){ umc.m3(); } },"t3"); Threadt4=newThread(newRunnable(){ @Override publicvoidrun(){ umc.m4(); } },"t4"); Threadt5=newThread(newRunnable(){ @Override publicvoidrun(){ umc.m5(); } },"t5"); t1.start();//c1 t2.start();//c1 t3.start();//c2 try{ Thread.sleep(2000); }catch(InterruptedExceptione){ e.printStackTrace(); } t4.start();//c1 try{ Thread.sleep(2000); }catch(InterruptedExceptione){ e.printStackTrace(); } t5.start();//c2 } }
以上这篇浅谈多线程中的锁的几种用法总结(必看)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。