synchronized与volatile的区别

  • volatile是线程同步的轻量级实现,因此volatile性能好于synchronized
  • voaltile修饰变量,synchronized修饰方法和代码块
  • 多线程访问volatile不会发生阻塞,但访问synchronized可能会阻塞
  • volatile可以保证数据的可见性,但不能保证原子性;而synchronized既可以保证原子性,也可以间接保证可见性。
  • volatile解决的是变量在多个线程之间的可见性,而Synchronized解决的是多个线程之间访问资源的同步性

synchronized与ReentrantLock的区别

  • 都是可重入锁
  • synchronized是依赖于JVM实现的;而reentrantLock是依赖于JDK实现的,是API层面的,需要Lock()和unLock()方法配合try/finally语句块来完成。
  • reentrantLock比synchronized多了三项功能:等待可中断,可实现公平锁,可实现选择性通知(锁可绑定多个条件)。

等待可中断:等待可中断是指线程可以选择放弃等待,改为处理其他事情,ReenTrantLock通过lock.lockInterruptibly()来实现的。

公平锁:先等待的线程先获得锁。Synchronized只能是非公平锁。ReenTrantLock默认情况是非公平的,可以通过 ReentrantLock(boolean fair)构造方法来指定是公平锁还是非公平锁。

选择性通知:Synchronized关键字与wait()和notify/notifyAll()方法相结合可以实现等待/通知机制,但被通知的线程是由JVM随机选择。Synchronized相当于整个Lock对象中只有一个单一的condition对象,所有的线程都注册在它一个对象身上。线程开始notifyAll()时,需要通知所有等待的线程,没有选择权,会造成很大的效率问题。而ReenTrantLock可以借助Condition对象实现选择性通知,具有更好的灵活性。比如:可以在一个Lock对象里创建多个Condition实例(即对象监视器),线程对像可以注册在指定的Condition中,从而可以有选择的进行线程通知,即使使用signalAll()方法也只会唤醒注册在该Condition实例中所有等待的线程。

可重入锁:自己可以再次获取自己的内部锁。比如:一个线程获得了某个对象的锁,并且还没有释放,当这个线程再次想要获取这个对象的锁的时候还是可以获取的,如果不可锁重入的话,就会造成死锁。

synchronized与Lock、volatile的区别的更多相关文章

  1. 用阻塞队列实现一个生产者消费者模型?synchronized和lock有什么区别?

    多线程当中的阻塞队列 主要实现类有 ArrayBlockingQueue是一个基于数组结构的有界阻塞队列,此队列按FIFO原则对元素进行排序 LinkedBlockingQueue是一个基于链表结构的 ...

  2. synchronized 和 Lock 有什么区别?(未完成)

    synchronized 和 Lock 有什么区别?(未完成)

  3. java面试题之synchronized和lock有什么区别

    synchronized和lock的区别: 类别 synchronized lock 存在层次 java的关键字,在jvm层面上 是一个类 锁的释放 1.以获取锁的线程执行完同步代码,释放锁 2.线程 ...

  4. volatile、synchronized、lock有什么区别,以及在哪些场景下使用哪种方式?

    [转]JVM锁机制volatile/synchronized/lock 1.volatile实现原理 (1)聊聊并发(一)——深入分析Volatile的实现原理 --硬件级别锁实现,Lock前缀指令会 ...

  5. synchronized和lock有什么区别?

    一.原始构成 synchronized是关键字属于JVM层面,monitorenter(底层是通过monitor对象来完成,其实wait/notify等方法也依赖monitor对象只有在同步代码块和同 ...

  6. java面试-synchronized与lock有什么区别?

    1.原始构成: synchronized是关键字,属于JVM层面,底层是由一对monitorenter和monitorexit指令实现的. ReentrantLock是一个具体类,是API层面的锁. ...

  7. Java synchronized和 Lock 的区别与用法

    在分布式开发中,锁是线程控制的重要途径.Java为此也提供了2种锁机制,synchronized和lock.做为Java爱好者,自然少不了对比一下这2种机制,也能从中学到些分布式开发需要注意的地方.  ...

  8. Synchronized和lock的区别和用法

    一.synchronized和lock的用法区别 (1)synchronized(隐式锁):在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要 ...

  9. synchronized 与 lock 的区别

    synchronized 和 lock 的用法区别 synchronized(隐式锁):在需要同步的对象中加入此控制,synchronized 可以加在方法上,也可以加在特定代码块中,括号中表示需要锁 ...

  10. synchronized和Lock的区别是什么?

    原创2020-11-19 11:38:29011024区别:1.lock是一个接口,而synchronized是java的一个关键字.2.synchronized在发生异常时会自动释放占有的锁 ...

随机推荐

  1. [题解]UVA10986 Sending email

    链接:http://vjudge.net/problem/viewProblem.action?id=24941 描述:n个点,m条边的无向图,寻找从S到T的最短路. 思路:基础的单源点最短路 用Di ...

  2. REACT 使用antd Table 中rowSelection遇到的问题

    首先项目是尚硅谷的后台谷粒平台,在用到antd Table 中的 rowSelection时,出现了一个问题(P87时遇到的问题): 表格中的每一项前面有一个radio单选框可以选中,本来是想利用ro ...

  3. 完爆Excel!一个令人惊艳的数据展示工具,让你做图更轻松高效

    数据展示应该是最常见的需求,我们经常利用数据做总结.用数据做分享.但是我们该如何更好地展示给我们需要展示的人,如何才能让我们的数据表达更加动人,这个值得让人思索. 说到数据表达,常用的数据展示方式无非 ...

  4. IEnumerable< T >和IEnumerable区别 |枚举接口

    为什么我们在继承IEnumerable< T >接口的时候也要实现IEnumerable接口. 新的代码里面都用IEnumerable< T >,因为泛型的类型是安全的.我们可 ...

  5. UML 包图 详细介绍

      6.1 包图的概念 包是一种常规用途的组合机制.UML中的一个包直接对应于Java中的一个包,C#中的命名空间.在Java中,一个包可能含有其他包.类或者同时含有这两者.进行建模时,通常使用逻辑性 ...

  6. 网络类型PAN、LAN、WLAN、CAN、MAN、WAN简单介绍

    转至:https://www.cnblogs.com/itmacy/p/12290036.html PAN:personal area network 个人区域网络 无线连接:蓝牙,红外,NFC 有线 ...

  7. 《Symfony 5全面开发》教程02、安装运行环境并初始化Symfony项目

    Symfony是PHP框架,在学习Symfony之前,我们需要安装PHP运行环境.如果你是MacOS系统,可以使用Homebrew来安装PHP运行环境. Homebrew官网 https://brew ...

  8. C++二维动态数组

    //创建 int **a=new int *[n]; for(i=0;i<n;i++) a[i]=new int[n]; // -- // 删除 for(i=0;i<n;i++) dele ...

  9. gcc与g++区别;编译选项

    gcc与g++区别:可以相互编译,但是gcc不会自动进行c++的链接 gcc g++编译选项: -E 预处理 -S 编译指定源文件但是不尽兴汇编 -c 编译汇编,但是不进行链接 -o 编译成可执行文件 ...

  10. 【高并发】两种异步模型与深度解析Future接口

    大家好,我是冰河~~ 本文有点长,但是满满的干货,以实际案例的形式分析了两种异步模型,并从源码角度深度解析Future接口和FutureTask类,希望大家踏下心来,打开你的IDE,跟着文章看源码,相 ...