了解可重入锁的含义,以及reentrantlock lock和synchronized的区别

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&Java锁之可重入锁介绍
投稿:junjie
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Java锁之可重入锁介绍,可重入锁,也叫做递归锁,指的是同一线程外层函数获得锁之后,内层递归函数仍然有获取该锁的代码,但不受影响,需要的朋友可以参考下
锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) 。这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及。本系列文章将分析JAVA下常见的锁名称以及特性,为大家答疑解惑。
四、可重入锁:
本文里面讲的是广义上的可重入锁,而不是单指JAVA下的ReentrantLock。
可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。
在JAVA环境下 ReentrantLock 和synchronized 都是 可重入锁。
下面是使用实例:
public class Test implements Runnable{
&public synchronized void get(){
&&System.out.println(Thread.currentThread().getId());
&public synchronized void set(){
&&System.out.println(Thread.currentThread().getId());
&@Override
&public void run() {
&public static void main(String[] args) {
&&Test ss=new Test();
&&new Thread(ss).start();
&&new Thread(ss).start();
&&new Thread(ss).start();
两个例子最后的结果都是正确的,即 同一个线程id被连续输出两次。
结果如下:
Threadid: 8
Threadid: 8
Threadid: 10
Threadid: 10
Threadid: 9
Threadid: 9
可重入锁最大的作用是避免死锁。
我们以自旋锁作为例子。
public class SpinLock {
&private AtomicReference&Thread& owner =new AtomicReference&&();
&public void lock(){
&&Thread current = Thread.currentThread();
&&while(!pareAndSet(null, current)){
&public void unlock (){
&&Thread current = Thread.currentThread();
&&pareAndSet(current, null);
对于自旋锁来说:
1、若有同一线程两调用lock() ,会导致第二次调用lock位置进行自旋,产生了死锁
说明这个锁并不是可重入的。(在lock函数内,应验证线程是否为已经获得锁的线程)
2、若1问题已经解决,当unlock()第一次调用时,就已经将锁释放了。实际上不应释放锁。
(采用计数次进行统计)
修改之后,如下:
public class SpinLock1 {
&private AtomicReference&Thread& owner =new AtomicReference&&();
&private int count =0;
&public void lock(){
&&Thread current = Thread.currentThread();
&&if(current==owner.get()) {
&&&count++;
&&while(!pareAndSet(null, current)){
&public void unlock (){
&&Thread current = Thread.currentThread();
&&if(current==owner.get()){
&&&if(count!=0){
&&&&count--;
&&&&pareAndSet(current, null);
该自旋锁即为可重入锁。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具码农小汪-ReentrantLock 可重入锁
码农小汪-ReentrantLock 可重入锁
ReentrantLock,可重入的互斥锁,是一种递归无阻塞的同步机制。它可以等同于synchronized的使用,但是ReentrantLock提供了比synchronized更强大、灵活的锁机制,可以减少死锁发生的概率。
对于ReentrantLock,官方有详细的说明:一个可重入的互斥锁定 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁定相同的一些基本行为和语义,但功能更强大。ReentrantLock 将由最近成功获得锁定,并且还没有释放该锁定的线程所拥有。当锁定没有被另一个线程所拥有时,调用 lock 的线程将成功获取该锁定并返回。如果当前线程已经拥有该锁定,此方法将立即返回。可以使用 isHeldByCurrentThread() 和 getHoldCount() 方法来检查此情况是否发生。
ReentrantLock提供公平锁机制,构造方法接收一个可选的公平参数。当设置为true时,它是公平锁,这些所将访问权授予等待时间最长的线程。否则该锁将无法保证线程获取锁的访问顺序。但是公平锁与非公平锁相比,公平锁的程序在许多线程访问时表现为很低的总体吞吐量。
* Creates an instance of {@code ReentrantLock}.
* This is equivalent to using {@code ReentrantLock(false)}.
public ReentrantLock() {
sync = new NonfairSync();
* Creates an instance of {@code ReentrantLock} with the
* given fairness policy.
* fair {@code true} if this lock should use a fair ordering policy
public ReentrantLock(boolean fair) {
sync = fair ? new FairSync() : new NonfairSync();
这里面写的几多复杂的!
我们来个简单的实例就行,我把刚刚自己实现的lock换成了他来使用
package ThredD
import java.util.concurrent.locks.L
import java.util.concurrent.locks.ReentrantL
public class ThreadLock {
private int count = 0;
Lock l = new ReentrantLock();
public void test() {
for (int i = 0; i & 5; i++) {
System.out.println(Thread.currentThread().getName() + "count:"
} catch (Exception e) {
e.printStackTrace();
} finally {
l.unlock();
public static void main(String[] args) {
ThreadLock testLock = new ThreadLock();
for (int i = 0; i & 3; i++) {
new Thread(new Runnable() {
public void run() {
testLock.test();
}).start();
ReentrantLock与synchronized的区别
我么有看懂,慢慢的学习吧~
前面提到ReentrantLock提供了比synchronized更加灵活和强大的锁机制,那么它的灵活和强大之处在哪里呢?他们之间又有什么相异之处呢?
首先他们肯定具有相同的功能和内存语义。
1、与synchronized相比,ReentrantLock提供了更多,更加全面的功能,具备更强的扩展性。例如:时间锁等候,可中断锁等候,锁投票。
2、ReentrantLock还提供了条件Condition,对线程的等待、唤醒操作更加详细和灵活,所以在多个条件变量和高度竞争锁的地方,ReentrantLock更加适合(以后会阐述Condition)。
3、ReentrantLock提供了可轮询的锁请求。它会尝试着去获取锁,如果成功则继续,否则可以等到下次运行时处理,而synchronized则一旦进入锁请求要么成功要么阻塞,所以相比synchronized而言,ReentrantLock会不容易产生死锁些。
4、ReentrantLock支持更加灵活的同步代码块,但是使用synchronized时,只能在同一个synchronized块结构中获取和释放。注:ReentrantLock的锁释放一定要在finally中处理,否则可能会产生严重的后果。
5、ReentrantLock支持中断处理,且性能较synchronized会好些。
我的热门文章
即使是一小步也想与你分享一.什么是sychronized
sychronized是java中最基本同步互斥的手段,可以修饰代码块,方法,类.
在修饰代码块的时候需要一个reference对象作为锁的对象.
在修饰方法的时候默认是当前对象作为锁的对象.
在修饰类时候默认是当前类的Class对象作为锁的对象.
synchronized会在进入同步块的前后分别形成monitorenter和monitorexit字节码指令.在执行monitorenter指令时会尝试获取对象的锁,如果此没对象没有被锁,或者此对象已经被当前线程锁住,那么锁的计数器加一,每当monitorexit被锁的对象的计数器减一.直到为0就释放该对象的锁.由此synchronized是可重入的,不会出现自己把自己锁死.
二.什么ReentrantLock
以对象的方式来操作对象锁.相对于sychronized需要在finally中去释放锁&
三.synchronized和ReentrantLock的区别
除了synchronized的功能,多了三个高级功能.
等待可中断,公平锁,绑定多个Condition.
1.等待可中断
在持有锁的线程长时间不释放锁的时候,等待的线程可以选择放弃等待. & tryLock(long timeout, TimeUnit unit)
按照申请锁的顺序来一次获得锁称为公平锁.synchronized的是非公平锁,ReentrantLock可以通过构造函数实现公平锁. & &new RenentrantLock(boolean fair)
3.绑定多个Condition
通过多次newCondition可以获得多个Condition对象,可以简单的实现比较复杂的线程同步的功能.通过await(),signal();
& 开源中国(OSChina.NET) |
开源中国社区(OSChina.net)是工信部
指定的官方社区synchronized和ReentrantLock区别 - 博客频道 - CSDN.NET
你只有很努力,才看起来毫不费力
分类:JAVA
PS:http://my.oschina.net/u/2250599/blog/410585
更新下什么叫做可重入锁.
可重入锁,又叫递归锁,指的是同一线程外层函数获得锁之后,内部递归函数仍然持有该锁.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Sychronized是java中最基本同步互斥的手段,可以修饰代码块,方法,类.
在修饰代码块的时候需要一个reference对象作为锁的对象.
在修饰方法的时候默认是当前对象作为锁的对象.
在修饰类时候默认是当前类的Class对象作为锁的对象.
synchronized会在进入同步块的前后分别形成monitorenter和monitorexit字节码指令.在执行monitorenter指令时会尝试获取对象的锁,如果此没对象没有被锁,或者此对象已经被当前线程锁住,那么锁的计数器加一,每当monitorexit被锁的对象的计数器减一.直到为0就释放该对象的锁.由此synchronized是可重入的,不会出现自己把自己锁死.
二.什么ReentrantLock
以对象的方式来操作对象锁.相对于sychronized需要在finally中去释放锁&
三.synchronized和ReentrantLock的区别
除了synchronized的功能,多了三个高级功能.
等待可中断,公平锁,绑定多个Condition.
1.等待可中断
在持有锁的线程长时间不释放锁的时候,等待的线程可以选择放弃等待. & tryLock(long timeout, TimeUnit unit)
按照申请锁的顺序来一次获得锁称为公平锁.synchronized的是非公平锁,ReentrantLock可以通过构造函数实现公平锁. & &new RenentrantLock(boolean fair)
3.绑定多个Condition
通过多次newCondition可以获得多个Condition对象,可以简单的实现比较复杂的线程同步的功能.通过await(),signal();
排名:第11896名
(11)(1)(0)(0)(0)(1)(0)(6)(1)(7)(1)(176)}

我要回帖

更多关于 reentrantlock 锁投票 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信