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 ...
随机推荐
- js 浏览器页面切换事件
document.addEventListener('visibilitychange', function() { console.log(isHidden() + "-" + ...
- javascript学习笔记(六):对象、内置对象
创建对象 对象属性赋值的方式 <!DOCTYPE html> <html> <head lang="en"> <meta chaset=& ...
- JMeter学习(三十一)non-gui模式运行(转载)
转载自 http://www.cnblogs.com/yangxia-test 必须要了解的一些信息 既然是要通过non-gui模式运行,那么我们就不得不去了解下在non-gui模式下jmeter命令 ...
- RecyclerView的单击和长按事件(转)
转自:http://www.jianshu.com/p/f2e0463e5aef 前言 上一篇文章揭开RecyclerView的神秘面纱(一):RecyclerView的基本使用中,主要讲述了Recy ...
- C++ map中使用erase应该注意到的问题
注意:此程序在win环境下会出现上述描述的问题:在mac环境下第一种方式是正常运行的.Map.erase有3个重载函数: void erase(iterator position); size_typ ...
- AngularJS——第8章 服务
第8章 服务 服务是一个对象或函数,对外提供特定的功能. 8.1 内建服务 1. $location是对原生Javascript中location对象属性和方法的封装. // $location内置服 ...
- go语言使用go-sciter创建桌面应用(一) 简单的通过html,css写ui
我们使用go-sciter,就不得不提Sciter,Sciter 是一个嵌入式的 HTML/CSS/脚本引擎,旨在为桌面应用创建一个 UI 框架层. 说简单点就是我们通过它可以像写html,css那样 ...
- Web.config Transformation Syntax for Web Application Project Deployment
Web.config Transformation Syntax for Web Application Project Deployment Other Versions Updated: Ma ...
- java传统web项目添加maven管理jar包,log4j无法正常输出日志
本文适合1年以上编程基础的开发人员阅读,非技术创新,可作为故障排除实录参考/收藏. 背景 笔者最近在给公司一个老的web项目改造升级,项目使用springmvc+mybatis,由于项目比较久远,没有 ...
- Redhat(RHEL)配置静态IP
vim /etc/sysconfig/network NETWORKING=yes NETWORKING_IPV6=no HOSTNAME=itcc.dev GATEWAY=192.168.0.1 v ...