简单了解Java中的可重入锁

 更新时间:2019年11月27日 09:45:55   作者:syrdbt  
这篇文章主要介绍了简单了解Java中的可重入锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了简单了解Java中的可重入锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

本文里面讲的是广义上的可重入锁,而不是单指JAVA下的ReentrantLock。

可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。

在JAVA环境下 ReentrantLock 和synchronized 都是 可重入锁。

下面是使用实例:

package reentrantLock;
 
public class Test implements Runnable{
 
  public synchronized void get(){
    System.out.println(Thread.currentThread().getId());
    set();
  }
 
  public synchronized void set(){
    System.out.println(Thread.currentThread().getId());
  }
 
  @Override
  public void run() {
    get();
  }
  public static void main(String[] args) {
    Test ss=new Test();
    new Thread(ss).start();
    new Thread(ss).start();
    new Thread(ss).start();
  }
}

运行截图:

package reentrantLock;
 
import java.util.concurrent.locks.ReentrantLock;
 
public class Test implements Runnable {
  ReentrantLock lock = new ReentrantLock();
 
  public void get() {
    lock.lock();
    System.out.println(Thread.currentThread().getId());
    set();
    lock.unlock();
  }
 
  public void set() {
    lock.lock();
    System.out.println(Thread.currentThread().getId());
    lock.unlock();
  }
 
  @Override
  public void run() {
    get();
  }
 
  public static void main(String[] args) {
    Test ss = new Test();
    new Thread(ss).start();
    new Thread(ss).start();
    new Thread(ss).start();
  }
}

可重入锁最大的作用是避免死锁

我们以自旋锁作为例子,

public class SpinLock {
	private AtomicReference<Thread> owner =new AtomicReference<>();
	public void lock(){
		Thread current = Thread.currentThread();
		while(!owner.compareAndSet(null, current)){
		}
	}
	public void unlock (){
		Thread current = Thread.currentThread();
		owner.compareAndSet(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++;
			return ;
		}
 
		while(!owner.compareAndSet(null, current)){
 
		}
	}
	public void unlock (){
		Thread current = Thread.currentThread();
		if(current==owner.get()){
			if(count!=0){
				count--;
			}else{
				owner.compareAndSet(current, null);
			}
 
		}
 
	}
}

该自旋锁即为可重入锁。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot2.0+阿里巴巴Sentinel动态限流实战(附源码)

    SpringBoot2.0+阿里巴巴Sentinel动态限流实战(附源码)

    这篇文章主要介绍了SpringBoot2.0+阿里巴巴Sentinel动态限流实战(附源码),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 剖析Java中的事件处理与异常处理机制

    剖析Java中的事件处理与异常处理机制

    这篇文章主要介绍了Java中的事件处理与异常处理机制,讲解Java是如何对事件或者异常作出响应以及定义异常的一些方法,需要的朋友可以参考下
    2016-01-01
  • java Swing JFrame框架类中setDefaultCloseOperation的参数含义与用法示例

    java Swing JFrame框架类中setDefaultCloseOperation的参数含义与用法示例

    这篇文章主要介绍了java Swing JFrame框架类中setDefaultCloseOperation的参数含义与用法,结合实例形式分析了Swing组件的JFrame框架类中setDefaultCloseOperation方法的简单使用技巧,需要的朋友可以参考下
    2017-11-11
  • Java连接Redis全过程讲解

    Java连接Redis全过程讲解

    这篇文章主要介绍了Java连接Redis全过程讲解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Spring Boot 启动注解过程分析

    Spring Boot 启动注解过程分析

    这篇文章主要为大家介绍了Spring Boot 启动注解过程示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Java枚举之EnumSet详解

    Java枚举之EnumSet详解

    这篇文章主要介绍了Java枚举之EnumSet详解,使用时进行与或运算,但是定义多了之后,会很乱、臃肿,编写容易出错,EnumSet可以实现类似的功能,且使用起来很简洁,需要的朋友可以参考下
    2023-12-12
  • 深入详解java高并发热点数据更新

    深入详解java高并发热点数据更新

    这篇文章主要为大家深入介绍了java高并发热点数据更新详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • springcloud实现注册中心Eureka

    springcloud实现注册中心Eureka

    这篇文章主要介绍了springcloud实现注册中心Eureka,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • Mybatis如何实现@Select等注解动态组合SQL语句

    Mybatis如何实现@Select等注解动态组合SQL语句

    这篇文章主要介绍了Mybatis如何实现@Select等注解动态组合SQL语句,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • spring之Bean的生命周期详解

    spring之Bean的生命周期详解

    本篇文章主要介绍了spring之Bean的生命周期详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05

最新评论