synchronized与Lock、volatile的区别
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的区别的更多相关文章
- 用阻塞队列实现一个生产者消费者模型?synchronized和lock有什么区别?
多线程当中的阻塞队列 主要实现类有 ArrayBlockingQueue是一个基于数组结构的有界阻塞队列,此队列按FIFO原则对元素进行排序 LinkedBlockingQueue是一个基于链表结构的 ...
- synchronized 和 Lock 有什么区别?(未完成)
synchronized 和 Lock 有什么区别?(未完成)
- java面试题之synchronized和lock有什么区别
synchronized和lock的区别: 类别 synchronized lock 存在层次 java的关键字,在jvm层面上 是一个类 锁的释放 1.以获取锁的线程执行完同步代码,释放锁 2.线程 ...
- volatile、synchronized、lock有什么区别,以及在哪些场景下使用哪种方式?
[转]JVM锁机制volatile/synchronized/lock 1.volatile实现原理 (1)聊聊并发(一)——深入分析Volatile的实现原理 --硬件级别锁实现,Lock前缀指令会 ...
- synchronized和lock有什么区别?
一.原始构成 synchronized是关键字属于JVM层面,monitorenter(底层是通过monitor对象来完成,其实wait/notify等方法也依赖monitor对象只有在同步代码块和同 ...
- java面试-synchronized与lock有什么区别?
1.原始构成: synchronized是关键字,属于JVM层面,底层是由一对monitorenter和monitorexit指令实现的. ReentrantLock是一个具体类,是API层面的锁. ...
- Java synchronized和 Lock 的区别与用法
在分布式开发中,锁是线程控制的重要途径.Java为此也提供了2种锁机制,synchronized和lock.做为Java爱好者,自然少不了对比一下这2种机制,也能从中学到些分布式开发需要注意的地方. ...
- Synchronized和lock的区别和用法
一.synchronized和lock的用法区别 (1)synchronized(隐式锁):在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要 ...
- synchronized 与 lock 的区别
synchronized 和 lock 的用法区别 synchronized(隐式锁):在需要同步的对象中加入此控制,synchronized 可以加在方法上,也可以加在特定代码块中,括号中表示需要锁 ...
- synchronized和Lock的区别是什么?
原创2020-11-19 11:38:29011024区别:1.lock是一个接口,而synchronized是java的一个关键字.2.synchronized在发生异常时会自动释放占有的锁 ...
随机推荐
- 来自牛逼哥的阴间MD5(web)
这个web题目是来自队里面牛逼哥的题目,审计源码, 看到这两个参数,前面的a和b就是直接输出数字,再看下面的,需要弱比较的输出一个c,要求应该是需要一个加密之前是一个0e开头的字符串,加密之后还是0e ...
- IEnumerable< T >和IEnumerable区别 |枚举接口
为什么我们在继承IEnumerable< T >接口的时候也要实现IEnumerable接口. 新的代码里面都用IEnumerable< T >,因为泛型的类型是安全的.我们可 ...
- 哈工大 计算机网络 实验一 HTTP 代理服务器的设计与实现
计算机网络实验代码与文件可见github:计算机网络实验整理 实验名称 HTTP 代理服务器的设计与实现 实验目的: 熟悉并掌握 Socket 网络编程的过程与技术:深入理解 HTTP 协议, 掌握 ...
- Qt:QByteArray
0.说明 QByteArray是存储二进制byte数组. 区别于QString:QByteArray中存储的全是byte,而QString中存储的全是16 bit Unicode码.QString是在 ...
- Linux的用户与用户组管理
1.Linux用户与用户组 Linux 是多用户多任务操作系统,Linux 系统支持多个用户在同一时间内登陆,不同用户可以执行不同的任务,并且互不影响.不同用户具有不问的权限,毎个用户在权限允许的范围 ...
- python刷剑指offer(1-20)(一刷)
2019/07/28开始刷每天6题,一共66题,刷三遍,9月1号完成. 1.二维数组中的查找: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增 ...
- 前端人员不要只知道KFC,你应该了解 BFC、IFC、GFC 和 FFC
前言 说起KFC,大家都知道是肯德基,但面试官问你什么是BFC.IFC.GFC和FFC的时候,你是否能够像回答KFC是肯德基时的迅速,又或者说后面这些你根本就没听说过,作为一名前端开发工程师,以上这些 ...
- Python迭代器,生成器,装饰器
迭代器 通常来讲从一个对象中依次取出数据,这个过程叫做遍历,这个手段称为迭代(重复执行某一段代码块,并将每一次迭代得到的结果作为下一次迭代的初始值). 可迭代对象(iterable):是指该对象可以被 ...
- LeetCode-098-验证二叉搜索树
验证二叉搜索树 题目描述:给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和 ...
- 一台电脑设置多个网段的IP地址