《ReentrantLock与synchronized的区别》

这篇具有很好参考价值的文章主要介绍了《ReentrantLock与synchronized的区别》。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

Synchronized同步锁

synchronized的用法:

ReentrantLock

ReentrantLock和Synchronized的区别


 

Synchronized同步锁

        使用Synchronized关键字将一段代码锁起来,同一时间只允许一个线程访问。只有获取了这把锁的线程才能访问这段代码,并且只有一个线程拥有这把锁。这样就保证了代码的安全性。

synchronized的用法:

        1.修饰实例方法:synchronized修饰实例方法,则用到的锁,默认为this当前方法调用对象。

        只有获取this锁的线程才能访问当前方法。同一时刻只有一个线程持有this锁。

	public synchronized void add() {
		
	}
	public void add1() {
	    synchronized(this) {
			
		}
	}
//使用synchronized关键字修饰方法时,两种写法作用与意义相同

        2.修饰静态方法 :修饰静态方法,用到的锁,默认为当前类的Class对象

	public synchronized static void add() {
		
	}

        3.修饰代码块:修饰代码块,用到的锁是可以指定的,为指定的某类对象。        

	Object obj = new Object();
	public void de() {
		synchronized(obj) {
			
		}
	}

         当一个线程访问对象的一个synchronized(this)同步代码块时,另一线程仍然可以访问该对象中的非synchronized(this)同步代码块。        

        父类中synchronized修饰的方法,如果子类没有重写,,则该方法仍然是线程安全的;如果子类重写,并没有使用synchronized修饰,则该方法是线程不安全的。

        定义接口方法时,不能使用synchronized关键字;

        构造方法不能使用synchronized关键字,但是可以使用synchronized代码块来进行同步。

        离开synchronized代码块后,该线程持有的锁,自动释放。

ReentrantLock

        ReentrantLock是Java中一种可重入锁。

        重入锁:一个线程,在获取锁后,可以继续获取同一个锁

                

public class Counter {
    private int count = 0;

    public synchronized void add(int n) {
        if (n < 0) {
            dec(-n);
        } else {
            count += n;
        }
    }

    public synchronized void dec(int n) {
        count += n;
    }
}
//当执行add()方法后,会继续调用dec()方法,dec方法也需要获取this锁。

         JVM允许同一个线程重复获取同一个锁,这种能被反复获取的锁,叫可重入锁。

        ReentrantLock是可重入锁,synchronized也是可重入锁。

        在获取可重入锁时,要记录这是第几次获取,没获取一次记录+1,每次退出可重入锁,记录-1,减到0时,才会真正释放锁。

public class Counter {
    private final Lock lock = new ReentrantLock();
    private int count;

    public void add(int n) {
        lock.lock();
        try {
            count += n;
        } finally {
            lock.unlock();
        }
    }
}

        ReentrantLock是JavaSE 核心类库的并发包(java.util.concurrent)提供的可重入锁,所以以防有异常发生,无法正常释放锁所以在创建锁后,在finally中释放锁。

        ReentrantLock还可以尝试获取锁:

                

if (lock.tryLock(1, TimeUnit.SECONDS)) {
    try {
        ...
    } finally {
        lock.unlock();
    }
}

尝试获取锁,最多等待一秒。一秒后,还未获取到锁,直接返回false,程序可以尝试做一些额外的处理,而不是无线等待。

        所以,ReentrantLock比synchronized更安全,在使用tryLock()失败后不会产生死锁。 

  ReentrantLock内部有三个类:Sync、NonfairSync、FairSync。

        NonfairSync类继承了Sync类,表示采用非公平策略获取锁:每一次都尝试获取锁,不会按照公平等待的原则进行等待,不会让等待最久的线程获得锁。

        FairSync类也继承了 Sync类,表示采用公平策略获取锁:当资源空闲时,它总是会先判断 sync队列是否有等待时间更长的线程,如果存在,则将当前线程加入到等待队列的尾部,实现了公平获取原则。

        ReentrantLock构造函数:默认是采用的非公平策略获取锁。

        ReentrantLock(boolean) 构造函数:可以传递参数确定采用公平策略或者是非公平策略,参数为 true表示公平策略,否则,采用非公平策略。

ReentrantLock和Synchronized的区别

        

ReentrantLock Synchronized
锁实现机制 AQS 监视器Monitor
获取锁 可以通过tryLock()尝试获取锁,更灵活 线程抢占模型
释放锁 必须显示通过unlock()释放锁 自动释放
锁类型 支持公平锁和非公平锁 非公平锁
可重入性 可重入 可重入

                

         

     

 

 

        

 

         

 

     

         

 

   文章来源地址https://www.toymoban.com/news/detail-596738.html

到了这里,关于《ReentrantLock与synchronized的区别》的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【JUC基础】05. Synchronized和ReentrantLock

    前面两篇中分别讲了Synchronized和ReentrantLock。两种方式都能实现同步锁,且也都能解决多线程的并发问题。那么这两个有什么区别呢? 这个也是一个高频的面经题。 什么是可重入锁? 可重入锁,也称为递归锁,是指同一线程在外层方法获取锁的时候,在进入内层方法会自动获

    2024年02月08日
    浏览(64)
  • Java——》Synchronized和Lock区别

    推荐链接:     总结——》【Java】     总结——》【Mysql】     总结——》【Redis】     总结——》【Kafka】     总结——》【Spring】     总结——》【SpringBoot】     总结——》【MyBatis、MyBatis-Plus】     总结——》【Linux】     总结——》【MongoDB】    

    2024年02月09日
    浏览(28)
  • 【Java】后端开发语言Java和C#,两者对比注解和属性的区别以及作用

    欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《Java》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。 温馨提示:博主能力有限,理解水平有限

    2024年01月16日
    浏览(44)
  • Lock和synchronized的区别

    1、Lock是一个接口,而synchronized是一个Java,synchronized是内置的语言实现,Lock是代码层面的实现 2、Lock可以选择性的获取锁,如果一段时间获取不到,咋可以不要了。synchronized不行,不达目的不罢休。借助这个特性,Lock可以避免死锁,而synchronized不惜通过谨慎的设计才

    2024年02月08日
    浏览(28)
  • lock 和synchronized 的区别

    1  lock是接口实现,synchronized是内置方法native实现 2 lock可以主动释放锁,synchronized只能是加锁的代码块执行完毕或者遇到异常退出被动的释放锁 3 性能方面,如果竞争资源不是很激烈的情况,两者的性能差不太多,如果是在竞争资源激烈的情况下,lock的性能要优于synchronize

    2024年02月08日
    浏览(30)
  • Synchronized与Lock的区别和优缺点

    1.   synchronized 是 Java 的一个内置特性,而 Lock 是 Java 的一个接口类; 2.   synchronized 在发生异常时会自动释放线程占用的锁,而 Lock 在发生异常时(不发生也一样)需要主动在 finally 中调用 unLock() 去释放锁; 3.   Lock 可以让等待锁的线程响应中断,而 synchronized 无法

    2024年02月08日
    浏览(35)
  • Java中的ReentrantLock实现原理

    在并发编程中,线程安全问题一直是非常重要的问题。Java中提供了多种解决线程安全问题的机制,其中一个比较常用的就是ReentrantLock。本文将介绍ReentrantLock的实现原理,从原子性、可见性等方面解释并结合源码分析,以便更好地理解在多线程环境下实现线程安全的过程。

    2024年02月01日
    浏览(35)
  • java ReentrantLock 锁 await、signal的用法

    在并发编程中,为了保证线程的原子执行,需要使用锁,jvm 内 可以使用 synchronized 和 ReentrantLock,如果是集群部署,我们可以使用Redis 分布式锁 其他的锁后面再介绍。 1、ReentrantLock 通过方法 lock()与 unlock()来进行加锁与解锁操作,与synchronized(1.8之后性能得到提升)会被JVM自动

    2024年02月11日
    浏览(72)
  • Autosar RTE C/S接口实现及synchronous与asynchronous的区别

    在之前的一篇文章中,介绍了RTE中的S/R接口,也是RTE中使用最多的接口。在Autosar定义的Interface中,分为Require Ports(需求接口,对应的S/R接口中的 Receiver接口 ,C/S接口中的 Client接口 )和Provide Ports(提供接口,对应S/R接口中的 Sender接口 ,C/S接口中的 Server接口 )。 S/R接口主要针对

    2024年02月10日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包