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 ...
随机推荐
- SVM参数解析
一.Opencv中的核函数定义(4种): 1.CvSVM::LINEAR : 线性内核,没有任何向映射至高维空间,线性区分(或回归)在原始特点空间中被完成,这是最快的选择. 2.CvSVM::POLY ...
- maven <scope>provided</scope>
今天开发web的时候,需要用到servlet-api,于是在pom.xml中添加依赖 <dependency> <groupId>javax.servlet</group ...
- Using Fetch
[Using Fetch] This kind of functionality was previously achieved using XMLHttpRequest. Fetch provide ...
- python网络编程之进程论
标签(空格分隔): 进程 什么是进程: 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu; 进程与程序的区别: 程序仅仅只是一堆代码而已,而进程指的是程序的运行过程 注意: 需要强调的 ...
- cdnbest节点安装后连不上cdn主控原因排查
1. 查看节点程序是否启动 ps -aux |grep kangle 2. 登陆cdn节点用telnet命令查下和主控的通信,命令:telnet 主控ip 3320 3. 如果节点程序都有启动,可查看 ...
- DB2 57016报错的解决办法(表状态不正常,导致表无法操作)
新建了一张表,删除了一列,然后执行insert的时候,报错 57016,解释为:因为表不活动. 1.执行db2 "load query table <tabname>" ...
- HTTP协议之请求
HTTP请求 组成 一个http请求通常由三个部分组成: 请求行(request line) 首部(header) 主体(body) 格式如下所示 <request-line><CR ...
- es快照定时备份脚本
#!/bin/bashdata1=`date "+%Y%m%d"`data2="http://0.0.0.0:9200/_snapshot/my_backup/snaps ...
- 从上往下打印二叉树(python)
题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. # -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # ...
- Django项目之客户
关于客户的操作 主页(被继承) {% load static %} <!DOCTYPE html> <html lang="en"> <head> ...