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 同步不能实现对等待中的线程实现中断操作。

时间: 2024-08-29 04:52:26

ReentrantLock 与 synchronized 一点区别的相关文章

ReentrantLock和synchronized的区别

一.ReentrantLock类 ReentrantLock 类实现了 Lock ,它拥有与 synchronized 相同的并发性和内存语义,但是添加了类似锁投票.定时锁等候和可中断锁等候的一些特性.此外,它还提供了在激烈争用情况下更佳的性能(换句话说,当许多线程都想访问共享资源时,JVM 可以花更少的时候来调度线程,把更多时间用在执行线程上)       Reentrant 锁意味着什么呢?简单来说,它有一个与锁相关的获取计数器,如果拥有锁的某个线程再次得到锁,那么获取计数器就加1,然后锁需

reentrantlock与synchronized的区别.及Atomics的使用

ReentranLock是java.util.concurrent.locks中的一个类.需要显示的进行unclock 提供了tryLock方法,锁被其他线程持有返回false,否则当前线程会持有锁,并返回true 可以通过构造函数声明一个公平锁,效率较非公平锁低,按队列顺序获取锁 提供了ReentrantReadWriteLock,用于读多写少并且读不需要互斥的场景,比互斥锁效率高很多 ReentranLock的使用: lock.lock(); try{ //do something }fin

ReentrantLock详解 以及与synchronized的区别

ReentrantLock lock = new ReentrantLock(); //参数默认false,不公平锁 ReentrantLock lock = new ReentrantLock(true); //公平锁 lock.lock(); //如果被其它资源锁定,会在此等待锁释放,达到暂停的效果 try { //操作 } finally { lock.unlock(); } Java 理论与实践: JDK 5.0 中更灵活.更具可伸缩性的锁定机制 新的锁定类提高了同步性 -- 但还不能现

ReenTrantLock可重入锁(和synchronized的区别)总结

可重入性: 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大.两者都是同一个线程没进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁. 锁的实现: Synchronized是依赖于JVM实现的,而ReenTrantLock是JDK实现的,有什么区别,说白了就类似于操作系统来控制实现和用户自己敲代码实现的区别.前者的实现是比较难见到的,后者有直接的源码可供阅读. 性能的区别: 在S

ReentrantLock和synchronized区别和联系?

相同:ReentrantLock提供了synchronized类似的功能和内存语义,都是可重入锁. 不同: 1.ReentrantLock功能性方面更全面,比如时间锁等候,可中断锁等候,锁投票等,因此更有扩展性.在多个条件变量和高度竞争锁的地方,用ReentrantLock更合适,ReentrantLock还提供了Condition,对线程的等待和唤醒等操作更加灵活,一个ReentrantLock可以有多个Condition实例,所以更有扩展性. 2.ReentrantLock必须在finall

Java中的ReentrantLock和synchronized两种锁定机制的对比

多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言.核心类库包含一个 Thread 类,可以用它来构建.启动和操纵线程,Java 语言包括了跨线程传达并发性约束的构造 —— synchronized 和 volatile .在简化与平台无关的并发类的开发的同时,它决没有使并发类的编写工作变得更繁琐,只是使它变得更容易了. synchronized 快速回顾 把代码块声明为 synchronized,有两个

(转) Java中的ReentrantLock和synchronized两种锁定机制的对比

原文:http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html 多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言.核心类库包含一个 Thread 类,可以用它来构建.启动和操纵线程,Java 语言包括了跨线程传达并发性约束的构造 -- synchronized 和 volatile .在简化与平台无关的并发类的开发的同时,它决没有使并

[转] Java的ReentrantLock和synchronized两种锁定机制

多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言.核心类库包含一个 Thread 类,可以用它来构建.启动和操纵线程,Java 语言包括了跨线程传达并发性约束的构造 —— synchronized 和 volatile .在简化与平台无关的并发类的开发的同时,它决没有使并发类的编写工作变得更繁琐,只是使它变得更容易了. synchronized 快速回顾 把代码块声明为 synchronized,有两个

Lock与synchronized的区别

synchronized是属于jvm层面的,如果遇到异常,jvm会自动释放锁.lock锁的释放是需要程序员操作,如果不释放就会产生死锁 在竞争不激烈的情况下,偶尔会有同步的情况发生,如果用synchronized会好一点,如果竞争很激烈的情况下,使用reentrantLock会好一点. package org.fkjava.oa.base; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Reen