`
zhanghaj00
  • 浏览: 62972 次
社区版块
存档分类
最新评论

关于ReentrantLock 的一个小实验

 
阅读更多

  

    今天做了一个小实验,关于Reentrantlock ,不知道自己理解的对不对。

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class LockTest {

	public  void  outer(){
		
		System.out.println("this is outer "+Thread.currentThread().getName());
	    inter();
		
	}
	public  void inter(){
		
		System.out.println("this is inter"+Thread.currentThread().getName());

	
	}
	public static void main(String[] args) {
		LockTest test = new LockTest();
		ReentrantLock lock = new ReentrantLock();
		Condition con = lock.newCondition();
		Thread test1 = new Thread(new RunTest1(test,lock,con),"task1");
		Thread test2 = new Thread(new RunTest2(test,lock,con),"task2");
		test1.start();
		test2.start();
	}
}
class RunTest1 implements Runnable{

	private LockTest lTest;
	ReentrantLock lock ;
	Condition con;
	public RunTest1(LockTest lTest,ReentrantLock lock,Condition con ){
		this.lock = lock;
		this.lTest = lTest;
		this.con = con;
	}
	@Override
	public void run() {
		//task1 上锁
		lock.lock();
		try {
			System.out.println("this is :"+Thread.currentThread().getName());
			//然后直接让task1 进入等待,这时候并没有释放锁
			con.await(5,TimeUnit.SECONDS);
			lTest.inter();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			lock.unlock();		
		}	
	}	
}
class RunTest2 implements Runnable{

	private LockTest lTest;
	
	ReentrantLock lock ;
	Condition con;
	public RunTest2(LockTest lTest,ReentrantLock lock,Condition con){
		
		this.lTest = lTest;
		this.lock = lock;
		this.con = con;
	}
	@Override
	public void run() {
		//得到锁
		lock.lock();
		System.out.println("this is :"+Thread.currentThread().getName());		
		//执行方法 task2
		lTest.outer();
		try {
			Thread.sleep(10);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			//释放  这里如果不释放锁,则上面task1 await结束后也会等待锁释放而无法执行下面的方法
			lock.unlock();
		}
		
	}	
}

 

    ReentrantLock  当Condition.await() 释放资源的时候,锁也会放掉,然后其他线程就可以获得锁然后执行任务,当await时间到了的时候就会再次去竞争锁。

 

  

this is :task1
this is :task2
this is outer task2
this is intertask2
this is intertask1

 

 

    囧。。一天时间竟搞点没用的东西。。。

    PS.哎 找不到工作呀。求大牛带学呀。。一个人自学太苦逼了。。。。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics