synchronized Lock
synchronized和Lock都是Java语言提供的两种实现对共享资源进行同步的机制。其中synchronized使用Object对象本身的wait()、notify()、notifyAll()方法实现调度机制,而Lock可以使用Condition进行进程之间的调度,完成synchronized实现的所有功能。
两者区别如下
1)用法不一样。在需要同步的对象中加入synchronized控制,synchronized既可以加在方法上,也可以加在特定的代码块上,括号中表示需要锁的对象。而Lock需要显式的指定起始位置和终止位置。synchronized是托管给JVM执行的,而Lock的锁定是通过代码实现的,它有比synchronized更精确的线程语义。
2)性能不一样。在JDK5中增加了一个Lock接口及其实现类ReentrantLock。它不仅拥有和synchronized相同的并发性和内存语义,还增加了锁投票、定时锁、等候和中断锁等。它们的性能在不同的情况下会有所不同:在竞争不是很激烈的情况下,synchronized的性能要优于ReentrantLock,但是在资源竞争很激烈的情况下,synchronized的性能会下降的非常快,而ReentrantLock的性能基本保持不变。
3)锁机制不一样。synchronized获得锁和释放锁的方式都是在块结构中,当获取多个锁时,必须以相反的顺序释放,并且是自动解锁,不会因为出了异常而导致没有被释放从而引发死锁。而Lock则需要开发人员手动去释放,并且必须在finally块中释放,否则会引起死锁问题的发生。此外,Lock还提供了更强大的功能,它的tryLock()方法可以采用非阻塞的方式去获取锁。
虽然synchronized和Lock都可以实现多线程的同步,但是,最好不要同时使用这两种同步机制,因为ReentrantLock与synchronized所使用的机制不同,所以他们的运行是独立的,相当于两种类型的锁,在使用时互不影响。
synchronized
synchronized 方法
Java中同一个类中的不同synchronized方法不可以并发执行。即Java中两个线程不可以同时访问一个对象的两个不同的synchronized方法。
多线程访问同一个类的synchronized方法时,都是串行执行的。就算有多个cpu也不列外。synchronized方法使用了Java类的内置锁,即锁住的是方法所属的对象本身。同一个锁某个时刻只能被一个线程所获取,因此其他线程都需要等待锁的释放。即使有多余的cpu可以执行,但是无法获取对象的内置锁,也不能进入synchronized方法执行,cpu因此空闲。如果某个线程长期持有一个竞争激烈的锁,那么将导致其他线程都因等待锁而被挂起,从而导致cpu无法得到利用,系统吞吐量低下,因此要尽量避免某个线程对锁的长期占有。
synchronized代码块
synchronized Lock的更多相关文章
- synchronized (lock) 买票demo 线程安全
加锁防止多个线程执行同一段代码! /** http://blog.51cto.com/wyait/1916898 * @author * @since 11/10/2018 * 某电影院目前正在上映贺 ...
- synchronized Lock用法
在介绍Lock与synchronized时,先介绍下Lock: public interface Lock { void lock(); void lockInterruptibly() throws ...
- Java 线程锁机制 -Synchronized Lock 互斥锁 读写锁
(1)synchronized 是互斥锁: (2)ReentrantLock 顾名思义 :可重入锁 (3)ReadWriteLock :读写锁 读写锁特点: a)多个读者可以同时进行读b)写者必须互斥 ...
- 6,synchronized, lock 区别
参考文档 http://zzhonghe.iteye.com/blog/826162 http://houlinyan.iteye.com/blog/1112535 1,ReentrantLock 拥 ...
- JMM内存模型+volatile+synchronized+lock
硬件内存模型: Java内存模型: 每个线程都有一个工作内存,线程只可以修改自己工作内存中的数据,然后再同步回主内存,主内存由多个内存共享. 下面 8 个操作都是原子的,不可再分的: 1) lock ...
- Synchronized&Lock&AQS详解
加锁目的:由于线程执行的过程是不可控的,所以需要采用同步机制来协同对对象可变状态的访问. 加锁方式:java锁分为两种--显示锁和隐示锁,本质区别在于显示锁需要的是程序员自己手动的进行加锁与解锁如Re ...
- synchronized Lock(本地同步)锁的8种情况
Lock(本地同步)锁的8种情况 总结与说明: * 题目: * 1.标准访问,请问是先打印邮件还是短信 Email * 2.email方法新增暂停4秒钟,请问是先打印邮件还是短信 Email * 3. ...
- 【Java并发系列04】线程锁synchronized和Lock和volatile和Condition
img { border: solid 1px } 一.前言 多线程怎么防止竞争资源,即防止对同一资源进行并发操作,那就是使用加锁机制.这是Java并发编程中必须要理解的一个知识点.其实使用起来还是比 ...
- 深入浅出Java并发包—锁(Lock)VS同步(synchronized)
今天我们来探讨一下Java中的锁机制.前面我们提到,在JDK1.5之前只能通过synchronized关键字来实现同步,这个前面我们已经提到是属于独占锁,性能并不高,因此JDK1.5之后开始借助JNI ...
随机推荐
- phpexcel如何读取带公式的excel文件得到值呢?
如果某个cell使用到了公式通过getValue()获取的是公式本身而通过getCalculatedValue()会有对象 getFormattedValue()获取到的是公式计算后的值
- 附加任务:团队作业7 Alpha冲刺
附加任务:团队作业7 Alpha冲刺 附加任务要求参考东北师范大学陈志勇老师博客:https://edu.cnblogs.com/campus/nenu/2016SE_NENU/homework/19 ...
- ScrollReveal.js 用于创建和管理元素进入可视区域时的动画效果,帮助你的网站增加吸引力。
ScrollReveal.js 用于创建和管理元素进入可视区域时的动画效果,帮助你的网站增加吸引力. 1.http://www.yangqq.com/jstt/css3/2017-08-08/787. ...
- 理解JVM2 栈内存,方法区,堆内存
堆,方法区,栈的关系 分配最大堆内存-Xmx32m class SimpleHeap(val id: Int){ fun show() = println("My id is $id&quo ...
- SQL Select语句完整的执行顺序(转)
SQL Select语句完整的执行顺序: 1.from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子句将数据划分为多个分组: 4.使用聚集函 ...
- linux中awk命令学习
awk是一个强大的文本分析工具,awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理. 通常获取某一行时,我们会使用 “grep 关键字“进行查找,但在读取某一列时, ...
- appium+python自动化测试
appium+python自动化测试 标签(空格分隔): appium 获取APP的包名 1.aapt即Android Asset Packaging Tool,在SDK的build-tools目录下 ...
- arguments对象的callee属性和caller属性
js中的arguments对象代表正在执行的函数和调用它的函数的参数.arguments对象有两个属性,callee和caller.collee表示当前正在执行的方法,caller表示调用该方法的对象 ...
- Java基础学习笔记(三)
18.2.1无参无返回值的方法 18.2.1.1定义方法的语法格式 public static void 方法名称(){ 方法体 } 方法调用 类名.方法名称(); 注意:在Java中,同一个类中的方 ...
- 153. Find Minimum in Rotated Sorted Array (Array; Divide-and-Conquer)
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...