浅谈多线程中的锁的几种用法总结(必看)
一、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
}
}
以上这篇浅谈多线程中的锁的几种用法总结(必看)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。