ReentrantLock 与 synchronized 一点区别

ReentrantLock 与 synchronized 相比主要特性:

1.等候时间锁;

2.可中断锁;

3.多个条件变量;


等候时间锁实现主要通过 reentrantlock.tryLock(5,TimeUnit.SECONDS)方法实现;

多个条件变量可通过reentrantlock.newCondition()   new出多个实例实现;

可中断锁在BlockingQueue中经常被用到,简单通过代码理解

package net.flyingfat.lock;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;


public class ReenLock2 {

	ReentrantLock lock=new ReentrantLock();
	Condition condition1=lock.newCondition();
	
	public static void main(String[] args)  {
		final ReenLock2 reenLock2=new ReenLock2();
		Thread t=new Thread(new Runnable() {
			public void run() {
				reenLock2.run(); //切换run1(),run2()
			}
		});
		t.start();
		
		Thread t1=new Thread(new Runnable() {
			public void run() {
				reenLock2.run(); //切换run1(),run2()

			}
		});
		t1.start();
		
		try {
			Thread.sleep(1000);
			t1.interrupt();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	public void run(){
		try{
			lock.lockInterruptibly(); //可中断锁
			System.out.println("thread:"+Thread.currentThread().getName()+" get lock");
			Thread.sleep(4000);
			System.out.println("thread:"+Thread.currentThread().getName()+" wake up");
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			System.out.println("thread:"+Thread.currentThread().getName()+" release lock");
			lock.unlock();
		}
	}
	
	
	public void run1(){
		try{
			lock.lock();  //ReentrantLock实现的常规锁
			System.out.println("thread:"+Thread.currentThread().getName()+" get lock");
			Thread.sleep(4000);
			System.out.println("thread:"+Thread.currentThread().getName()+" wake up");
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			System.out.println("thread:"+Thread.currentThread().getName()+" release lock");
			lock.unlock();
		}
	}
	
	
	public synchronized void run2(){  //synchronized 实现的常规锁
		try {
			System.out.println("thread:"+Thread.currentThread().getName()+" get lock");
			Thread.sleep(4000);
			System.out.println("thread:"+Thread.currentThread().getName()+" release lock");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	

	public void run3(){
		try{
			lock.tryLock(5,TimeUnit.SECONDS); //等候锁
			System.out.println("thread:"+Thread.currentThread().getName()+" get lock");
			Thread.sleep(4000);
			System.out.println("thread:"+Thread.currentThread().getName()+" wake up");
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			System.out.println("thread:"+Thread.currentThread().getName()+" release lock");
			lock.unlock();
		}
   }

}

0号线程和1号线程共同调用run()方法时,0号线程率先获得锁,进入4秒的休眠, 同时1号线程正在等待获取锁,当主线程对1号线程调用interrupt方法时,1号线程立即终止等待。

0号线程和1号线程共同调用run()1方法时,0号线程率先获得锁,进入4秒的休眠, 同时1号线程正在等待获取锁,当主线程对1号线程调用interrupt方法时,1号线程并没有立即终止,而是等待0号线程执行完毕,1号线程调用sleep方法时抛出终止异常。

run2和run1雷同,用synchronized 实现。这也反映 了synchronized 同步不能实现对等待中的线程实现中断操作。

你可能感兴趣的:(ReentrantLock,中断锁)