当前位置: 首页 > 编程笔记 >

ReentrantLock和Java中同步的区别

易博文
2023-03-14
本文向大家介绍ReentrantLock和Java中同步的区别,包括了ReentrantLock和Java中同步的区别的使用技巧和注意事项,需要的朋友参考一下

有两种方法可以通过多个线程锁定共享资源。一个是重入锁(Or ReadWriteLock),另一个是通过使用Synchronized方法。

Java 5的Java并发包中提供了ReentrantLock类。 

它是Lock接口的实现,根据java docs,Lock接口的实现提供了比使用同步方法可获得的操作更广泛的操作。

序号 重入锁 已同步
1
获取锁 
可重入锁类提供lock()了通过线程获取共享资源锁的方法 
您只需要编写synced关键字即可获取锁  
2
释放锁 
要释放锁,程序员必须调用unlock()方法
隐式完成 
3
 中断能力
lockInterruptible()方法可用于中断线程  
没有办法中断线程
4
公平 
此类的构造方法具有公平参数。如果将其设置为true,则锁定将授予对等待时间最长的 *线程的访问权限

锁不保证任何特定的访问权限
5
锁释放顺序 
锁可以以任何顺序释放 
锁应以获得锁的顺序释放 

ReentrantLock的示例

public class ReentrantLockExample implements Runnable{
   private Lock lock=new ReentrantLock();
   @Override
   public void run() {
      try {
         lock.lock()
         //锁定一些资源

      }
      catch (InterruptedException e) {
         e.printStackTrace();
      }
      finally {
         lock.unlock();
      }
   }
}

SynchronizedLock的示例

public class SynchronizedLockExample implements Runnable{
   @Override
   public void run() {
      synchronized (resource) {
         //锁定一些资源
      }
   }
}
 类似资料:
  • 问题内容: Java中的同步方法和同步块有什么区别? 我一直在网上搜索答案,人们似乎对此不太确定:-( 我的看法是,两者之间没有区别,只是synch块的作用域可能更多,因此锁定的时间更少了? 如果在静态方法上使用Lock,则采用什么Lock?班级锁是什么意思? 问题答案: 同步方法将方法接收器用作锁(即,用于非静态方法,而用于静态方法的封闭类)。 blocks将表达式用作锁。 因此,以下两种方法等

  • 本文向大家介绍谈谈 synchronized和ReenTrantLock 的区别?相关面试题,主要包含被问及谈谈 synchronized和ReenTrantLock 的区别?时的应答技巧和注意事项,需要的朋友参考一下 synchronized 早期的实现比较低效,对比 ReentrantLock,大多数场景性能都相差较大,但是在 Java 6 中对 synchronized 进行了非常多的改进。

  • 我在读Java的收藏,然后我读到了这一行: "没有一个集合类是同步的,但是正如您将在本章后面看到的,可以获得同步版本。" 有人能告诉我Java中同步和非同步集合的区别吗?

  • 本文向大家介绍java 中同步、异步、阻塞和非阻塞区别详解,包括了java 中同步、异步、阻塞和非阻塞区别详解的使用技巧和注意事项,需要的朋友参考一下 java 中同步、异步、阻塞和非阻塞区别详解 简单点说: 阻塞就是干不完不准回来,一直处于等待中,直到事情处理完成才返回; 非阻塞就是你先干,我先看看有其他事没有,一发现事情被卡住,马上报告领导。 我们拿最常用的send和recv两个函数来说吧..

  • synchronized 是和 if、else、for、while 一样的关键字,ReentrantLock 是类,这是二者的本质区别。既然 ReentrantLock 是类,那么它就提供了比synchronized 更多更灵活的特性,可以被继承、可以有方法、可以有各种各样的类变量 synchronized 早期的实现比较低效,对比 ReentrantLock,大多数场景性能都相差较大,但是在 J

  • 我正在尝试创建一个回调函数: 首先,我创建了一个函数接口,用于定义回调函数的约定 我创建了一个类,该类将定义一个方法来调用我的回调(我通过使用lambda表达式传递了接口的实现作为对此方法的引用) 下面是我的代码: 但当我运行这段代码时,我得到了这样的结果。 有人能告诉我为什么我会有这个例外吗?