历史知识:JDK5之前,只有synchronized 可以用,之后就有了ReetrantLock可以用了

ReetrantLock (再入锁)

  1、位于java.util.concurrnt.locks 包    juc包

  2、和CountDownLatch、FutureTask、Semaphore一样基于AQS实现的

  3、能够实现比synchronized更细粒度的控制,如控制fairness(公平性)

  3、调用lock()之后,必须调用用unlock()释放锁

  4、性能未必比synchronized高,并且也是可重入

ReetrantLock公平性的设置

  1、ReetrantLock fairLock = new ReetrantLock(true);

  2、参数为true时,倾向于将锁赋予等待时间最久的线程(减少线程饥饿的情况)

  3、公平锁:获取锁的顺序按先后调用lock方法的顺序(慎用)

  4、非公平锁:抢占的顺序不一定,看运气

  5、synchronized是非公平锁

其实通用场景中,公平性未必有想象中的那么重要,java的默认调用策略,很少会导致饥饿的情况发生,同时保证公平性的话,会导致额外的开销,自然会导致吞吐量下降。

public class ReentrantLockDemo implements  Runnable{
private static ReentrantLock lock = new ReentrantLock(false);
@Override
public void run(){
while (true){
try{
lock.lock(); // 一般加上try finally去使用
System.out.println(Thread.currentThread().getName() + " get lock");
Thread.sleep(1000);
} catch (Exception e){
e.printStackTrace();
} finally {
lock.unlock();
}
}
} public static void main(String[] args) {
ReentrantLockDemo rtld = new ReentrantLockDemo();
Thread thread1 = new Thread(rtld);
Thread thread2 = new Thread(rtld);
thread1.start();
thread2.start();
}
}

  

ReetrantLock 将锁对象化 (下面的三种情况,可以自行去用代码去实现,也是synchronized无法做到的内存)

  1、判断是否有线程,或者某个特定线程,在排队等待获取锁

  2、带超时的获取锁的尝试

  3、感知有没成功获取锁

是否能将wait \ notify \ notifyAll 对象化

  1、java.util.concurrent.locks.Condition

总结:

  1、synchronized 是关键字,ReetrantLock是类

  2、ReentrantLock 可以对获取锁的等待时间进行设置,避免死锁

  3、ReentantLock可以获取各种锁的信息

  4、ReentrantLock可以灵活地实现多路通知

  5、机制:sync操作Mark Word , lcok调用Unsafe 类的park()方法

synchronized 和ReentrantLock的区别的更多相关文章

  1. synchronized和ReentrantLock的区别

    synchronized和ReentrantLock的区别 synchronized是和if.else.for.while一样的关键字,ReentrantLock是类,这是二者的本质区别. 代写 既然 ...

  2. Synchronized 与 ReentrantLock 的区别!

    来源:cnblogs.com/baizhanshi/p/7211802.html 之前栈长分享了重入锁的概念:<到底什么是重入锁,拜托,一次搞清楚!>,今天现来深入了解下 Synchron ...

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

    java在编写多线程程序时,为了保证线程安全,需要对数据同步,经常用到两种同步方式就是Synchronized和重入锁ReentrantLock. 相似点: 这两种同步方式有很多相似之处,它们都是加锁 ...

  4. synchronized 和 ReentrantLock 的区别?

    synchronized 是和 if.else.for.while 一样的关键字,ReentrantLock 是类, 这是二者的本质区别.既然 ReentrantLock 是类,那么它就提供了比 sy ...

  5. Synchronized与ReentrantLock的区别

    1.ReentrantLock 拥有Synchronized相同的并发性和内存语义,此外还多了 锁投票,定时锁等候和中断锁等候 线程A和B都要获取对象O的锁定,假设A获取了对象O锁,B将等待A释放对O ...

  6. Synchronized的基本知识、实现原理以及其与ReentrantLock的区别

    一.synchronized知识 在谈论synchronized之前,我们需要了解线程安全问题的主要诱因.线程安全问题的主要诱因如下: 存在共享数据(也称为临界资源) 存在多条线程共同操作这些共享数据 ...

  7. synchronized和ReentrantLock区别

    一.什么是sychronized sychronized是java中最基本同步互斥的手段,可以修饰代码块,方法,类. 在修饰代码块的时候需要一个reference对象作为锁的对象. 在修饰方法的时候默 ...

  8. synchronized和ReentrantLock

    一.什么是sychronized sychronized是java中最基本同步互斥的手段,可以修饰代码块,方法,类. 在修饰代码块的时候需要一个reference对象作为锁的对象. 在修饰方法的时候默 ...

  9. Synchronized与ReentrantLock区别总结(简单粗暴,一目了然)

    这篇文章是关于这两个同步锁的简单总结比较,关于底层源码实现原理没有过多涉及,后面会有关于这两个同步锁的底层原理篇幅去介绍. 相似点:这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式的 ...

随机推荐

  1. JavaScript数组及相关方法

    数组 1.创建数组 var array = new Array(); var array = new Array(size);//指定数组的长度 var array = new Array(item1 ...

  2. hdu1848(sg函数打表)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1848 题意:中文题诶- 思路:直接sg函数打表就好了 代码: #include <iostrea ...

  3. cogs 610. 数对的个数

    610. 数对的个数 ★★   输入文件:dec.in   输出文件:dec.out   简单对比时间限制:1 s   内存限制:128 MB Description出题是一件痛苦的事情!题目看多了也 ...

  4. [Xcode 实际操作]二、视图与手势-(1)UIView视图的基本使用

    目录:[Swift]Xcode实际操作 本文将演示在视图控制器的根视图里添加两个视图对象. import UIKit class ViewController: UIViewController { ...

  5. 爬虫—使用Requests

    一,安装 pip install requests 二,基本用法 1.简单示例 import requests res = requests.get('https://www.baidu.com') ...

  6. 根据select中选定option触发不同事件

    做公司项目,要实现一个小需求,根据下拉框选定的数据,绑定不同的事件.我的思路是获取select下面的option值,然后给它们定义不同的点击事件,但是在使用中option不能添加类,同时没有click ...

  7. bzoj2806 [Apio2012]dispatching【可并堆】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2809 保存可并堆模版代码. #include <cstdio> #include ...

  8. linux系统下安装Git

    Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理.而国外的GitHub和国内的Coding都是项目的托管平台.Git 是 Linus Tor ...

  9. CentOS7.2 yum安装报错

    1.yum源repodata配置文件repomd.xml无法找到: Couldn't open file /mnt/cdrom/repodata/repomd.xml 先找到repomd.xml的路径 ...

  10. jsp九大内置对象响应类型

     内置对象            类型request            httpServletRequestout                jspWriterresponse         ...