【Java】【多线程】Synchronized 和 ReentrantLock的联系与区别

原创 2018年04月17日 16:21:09

转载:https://blog.csdn.net/u011202334/article/details/73188404

 1、synchronized的局限性

    synchronized是java内置的关键字,它提供了一种独占的加锁方式。synchronized的获取和释放锁由JVM实现,用户不需要显示的释放锁,非常方便。然而synchronized也有一定的局限性,例如:

  1. 当线程尝试获取锁的时候,如果获取不到锁会一直阻塞。
  2. 如果获取锁的线程进入休眠或者阻塞,除非当前线程异常,否则其他线程尝试获取锁必须一直等待。

    JDK1.5之后发布,加入了Doug Lea实现的concurrent包。包内提供了Lock类,用来提供更多扩展的加锁功能。Lock弥补了synchronized的局限,提供了更加细粒度的加锁功能。

2、Lock简介

Lock api如下:

复制代码
void lock();
void lockInterruptibly() throws InterruptedException;
boolean tryLock();
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
void unlock();
Condition newCondition();
复制代码

    其中最常用的就是lock和unlock操作了。因为使用lock时,需要手动的释放锁,所以需要使用try..catch来包住业务代码,并且在finally中释放锁。

     ReentrantLock是Lock的默认实现之一。那么lock()和unlock()是怎么实现的呢?首先我们要弄清楚几个概念

  • 可重入锁。可重入锁是指同一个线程可以多次获取同一把锁。ReentrantLock和synchronized都是可重入锁。
  • 可中断锁。可中断锁是指线程尝试获取锁的过程中,是否可以响应中断。synchronized是不可中断锁,而ReentrantLock则提供了中断功能。
  • ReentrantLock类有一个重要的函数newCondition(),用于获取Lock上的一个条件,Condition可用于线程间通信-await()、signal().
  • 公平锁与非公平锁。公平锁是指多个线程同时尝试获取同一把锁时,获取锁的顺序按照线程达到的顺序,而非公平锁则允许线程“插队”。synchronized是非公平锁,而ReentrantLock的默认实现是非公平锁,但是也可以设置为公平锁。
典型使用如下:
复制代码
private Lock lock = new ReentrantLock();
 
public void test(){
    lock.lock();
    try{
        doSomeThing();
    }catch (Exception e){
        // ignored
    }finally {
        lock.unlock();
    }
}

转载:https://www.cnblogs.com/baizhanshi/p/7211802.html

功能区别:

便利性:很明显Synchronized的使用比较方便简洁,并且由编译器去保证锁的加锁和释放,而ReenTrantLock需要手工声明来加锁和释放锁,为了避免忘记手工释放锁造成死锁,所以最好在finally中声明释放锁。

锁的细粒度和灵活度:很明显ReenTrantLock优于Synchronized

 

ReenTrantLock独有的能力:

1.      ReenTrantLock可以指定是公平锁还是非公平锁。而synchronized只能是非公平锁。所谓的公平锁就是先等待的线程先获得锁。

2.      ReenTrantLock提供了一个Condition(条件)类,用来实现分组唤醒需要唤醒的线程们,而不是像synchronized要么随机唤醒一个线程要么唤醒全部线程。

3.      ReenTrantLock提供了一种能够中断等待锁的线程的机制,通过lock.lockInterruptibly()来实现这个机制。

参考:https://blog.csdn.net/h_gao/article/details/49615835


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/love_Aym/article/details/79976313

Java进阶知识--Synchronized、Lock、ReentrantLock的区别

最近在看《Java并发编程的艺术》,书中不少知识是更深入的去讲解我们平时经常使用的并发实现机制,介绍了它们的实现原理和区别,读完之后真的有种醍醐灌顶的感觉,突然就好像明白了这些实现到底是干什么用、什么...
  • hunterliy
  • hunterliy
  • 2016-12-31 10:44:03
  • 409

synchronized和ReentrantLock区别浅析

一、什么是sychronized        sychronized是java中最基本同步互斥的手段,可以修饰代码块,方法,类.       在修饰代码块的时候需要一个reference对象作为锁的...
  • zmx729618
  • zmx729618
  • 2016-06-06 15:16:50
  • 2132

java的两种同步方式, Synchronized与ReentrantLock的区别

java在编写多线程程序时,为了保证线程安全,需要同步,经常用到两种同步方式就是Synchronized和重入锁ReentrantLock。 相似点: 这两种同步方式有很多相似之处,它们都是加锁方式同...
  • chenchaofuck1
  • chenchaofuck1
  • 2016-04-02 19:37:22
  • 10446

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

转载代码块声明为 synchronized,后果: 1.原子性(atomicity) 2.可见性(visibility) 可见性则更为微妙;它要对付内存缓存和编译器优化的各种反常行为...
  • imduan
  • imduan
  • 2016-11-29 21:22:18
  • 474

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

ReenTrantLock可重入锁(和synchronized的区别)总结 可重入性: 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的...
  • qq838642798
  • qq838642798
  • 2017-03-23 11:31:29
  • 9271

synchronized和锁(ReentrantLock) 区别

5ibc.net纯属抄袭本文 转载请注明出处 作者:小风筝0010 原文:http://blog.csdn.net/zheng548/article/details/54426947 ...
  • Zheng548
  • Zheng548
  • 2017-01-16 16:12:59
  • 1908

【Java之并发】ReentrantLock和synchronized区别

1、ReentrantLock和synchronized区别: 相同:ReentrantLock提供了synchronized类似的功能和内存语义。  不同: 1.Reentrant...
  • cangchen
  • cangchen
  • 2015-04-22 17:19:06
  • 763

Lock、ReentrantLock、ReentrantReadWriteLock原理及应用深入解析

Lock相比于synchronized具有更强大的功能,本文详细介绍lock、ReentrantLock和ReentrantReadWriteLock的原理与实用场景...
  • u011479540
  • u011479540
  • 2016-07-24 11:34:39
  • 2050

Lock、synchronized和ReadWriteLock的区别和联系以及Condition

在java多线程编程中,可能我们经常会遇到线程同步的问题,可以使用synchronized或者Lock去控制同步锁,他们都能实现线程的同步,下面来分析下这两种方式的区别:1.synchronized可...
  • qq_20641565
  • qq_20641565
  • 2016-11-18 00:20:03
  • 3913

synchronized和lock(reentrantlock) 区别

1.某个线程在等待一个锁的控制权的这段时间需要中断 2.需要分开处理一些wait-notify,ReentrantLock里面的Condition应用,能够控制notify哪个线程 3.具有公平锁...
  • ningguixin
  • ningguixin
  • 2014-04-17 18:09:07
  • 6528
收藏助手
不良信息举报
您举报文章:【Java】【多线程】Synchronized 和 ReentrantLock的联系与区别
举报原因:
原因补充:

(最多只允许输入30个字)