监视锁——Java同步的基本思想
翻译人员: 铁锚
翻译时间: 2013年11月13日
原文链接: Monitors – The Basic Idea of Java synchronization
如果你上过操作系统课程,你就知道监视锁(Monitor)是操作系统同步的一个重要概念,在Java中的同步机制也是基于同样的思想.
1. 什么是监视锁?
一个监视锁就如同一座大楼里面的一个特殊房间,这个特殊的房间同一时间只可以被一个客户(线程)所使用(就比如单人化妆间,不理解化妆间的可以搜索 更衣),当然,这个"房间"里通常会有一些数据,以及适量的代码。
如果一个客户想要占用这个特殊的化妆间,他必须先到大厅(Hallway,Entry Set)去排队, 服务员(调度程序)将会依据某种标准(比如,先来后到,FIFO)选出一个客户去使用.如果客户由于某种原因(如等待...)想暂停使用,将会被带到等候室,并在一定时间后的特定时间被再次调度.
总的来说,锁是一种功能单元(facility),监控各个线程对特殊资源的访问,确保只有一个线程可以访问被保护的数据和代码。
2. Java如何实现监视锁?
在Java虚拟机中,理论上每个对象和类(class对象)都关联了一把锁.要实现互斥(mutual exclusion)锁功能, 每个锁(lock,有时称为mutex)关联到每个对象/类.在操作系统书籍中这叫做信号量(semaphore),互斥锁(mutex)是一个二进制信号量.
如果某个线程持有了一个锁的某些资源,那么其他所有线程都不能获得这个锁及相关的资源,除非这个线程放开对锁的使用权.但我们在进行多线程编程时,如果一直都是我们手工去控制这个信号量,那肯定是非常麻烦和不安全的,幸好JVM自动帮我们处理了这种麻烦。
要锁住某个范围的代码和数据,意味着这些数据不能同时被多个线程访问,Java支持 synchronized 语句 和 synchronized 方法.一旦某部分代码被 synchronized 包装,那么这段范围就是锁定的范围。锁(lock)由JVM在后台自动实现.
3. 在Java同步代码中,锁住的是哪部分?
我们知道每个对象/类都关联着一把锁. 我觉得每个对象都是一把锁是个很恰当的说法,因为每个对象都有自己的关键部分,并可以监控线程顺序.
要让不同的线程进行协作,Java 提供了wait()方法来暂停线程自身,Object提供notify()方法来唤醒等待此对象(通知)的另一个线程.共有以下3个方法:
wait(long timeout, int nanos) wait(long timeout) //被另一个线程唤醒,或者超时自动唤醒. notify(all)
这3个方法只能在同步代码块或者同步方法内部调用。原因是如果一个方法不需要互斥,就没必要锁定或线程间协作,每个线程都可以自由地调用此方法。
同步代码示例: Java Thread: notify() and wait() examples
4. 对synchronized关键字的理解
如果是静态方法上加锁,则由JVM转换为对Class对象(这个资源)加锁。 加锁后其实有一把钥匙,由多个线程排队使用(如果有多个线程同时使用的话)。
如果是实例方法,那么就是对this对象加锁,此时,如果有 Object a,Object b,如果 a!=b,则各自的方法引用的锁并不是同一个。
如果是代码块级别的锁,其实本质是一样的,也可以锁定this,这就和实例方法上的差不多是一样了。
加锁的目的,是因为有时候需要在多个线程之间共享一些对象/或值,但是又要保证一定的业务逻辑和规则,为了保证这些操作的正确性而进行的。
参考文档:
1. Java Doc for Object
2. Thread synchronization
3. Locks and Synchronization
4. notify() vs notifyAll()
相关文章:
- Java Thread: notify() and wait() examples
- Interview Question – Use Java Thread to Do Math Calculation
- Why do we need Generic Types in Java?
- Java Thread: Status Diagram
监视锁——Java同步的基本思想的更多相关文章
- 锁——Java同步的基本思想
翻译人员: 铁锚 翻译时间: 2013年11月13日 原文链接: Monitors – The Basic Idea of Java synchronization 如果你上过操作系统课程,你就知道 ...
- 【线程系列四】[转]监听器-java同步的基本思想
转自:http://ifeve.com/think-in-java-monitor/ 如果你在大学学习过操作系统,你可能还记得监听器在操作系统中是很重要的概念.同样监听器在java同步机制中也有使用, ...
- 013-并发编程-java.util.concurrent.locks之-AbstractQueuedSynchronizer-用于构建锁和同步容器的框架、独占锁与共享锁的获取与释放
一.概述 AbstractQueuedSynchronizer (简称AQS),位于java.util.concurrent.locks.AbstractQueuedSynchronizer包下, A ...
- java锁和同步
Java 语言设计中的一大创新就是:第一个把跨平台线程模型和锁模型应用到语言中去,Java 语言包括了跨线程的关键字synchronized 和 volatile,使用关键字和java类库就能够简单的 ...
- 死磕 java同步系列之自己动手写一个锁Lock
问题 (1)自己动手写一个锁需要哪些知识? (2)自己动手写一个锁到底有多简单? (3)自己能不能写出来一个完美的锁? 简介 本篇文章的目标一是自己动手写一个锁,这个锁的功能很简单,能进行正常的加锁. ...
- 死磕 java同步系列之zookeeper分布式锁
问题 (1)zookeeper如何实现分布式锁? (2)zookeeper分布式锁有哪些优点? (3)zookeeper分布式锁有哪些缺点? 简介 zooKeeper是一个分布式的,开放源码的分布式应 ...
- 死磕 java同步系列之redis分布式锁进化史
问题 (1)redis如何实现分布式锁? (2)redis分布式锁有哪些优点? (3)redis分布式锁有哪些缺点? (4)redis实现分布式锁有没有现成的轮子可以使用? 简介 Redis(全称:R ...
- 死磕 java同步系列之ReentrantLock源码解析(二)——条件锁
问题 (1)条件锁是什么? (2)条件锁适用于什么场景? (3)条件锁的await()是在其它线程signal()的时候唤醒的吗? 简介 条件锁,是指在获取锁之后发现当前业务场景自己无法处理,而需要等 ...
- 死磕 java同步系列之ReentrantLock源码解析(一)——公平锁、非公平锁
问题 (1)重入锁是什么? (2)ReentrantLock如何实现重入锁? (3)ReentrantLock为什么默认是非公平模式? (4)ReentrantLock除了可重入还有哪些特性? 简介 ...
随机推荐
- 原生JS实现圆周运动
<body> <div id="ball" style="width:20px; height:20px; background:red; border ...
- python笔记十三(高阶函数、装饰器)
一.高阶函数 函数只要有以下两个特征中一个就可以称为高阶函数: a:函数名作为一个实参传入另一个函数中 b:函数的返回值中包含函数名 下面我们用代码来感受一下这两种形式: import time # ...
- JavaScript 流程语句知识脑图
- python命令行参数解析模块argparse和docopt
http://blog.csdn.net/pipisorry/article/details/53046471 还有其他两个模块实现这一功能,getopt(等同于C语言中的getopt())和弃用的o ...
- springMVC源码分析--访问请求执行ServletInvocableHandlerMethod和InvocableHandlerMethod
在之前一篇博客中springMVC源码分析--RequestMappingHandlerAdapter(五)我们已经简单的介绍到具体请求访问的执行某个Controller中的方法是在RequestMa ...
- 基于Nginx服务器和iOS9的HTTPS安全通信
简介 在网络通信中,使用抓包软件可以对网络请求进行分析,并进行重放攻击,重放攻击的解决方案一般是使用一个变化的参数,例如RSA加密的时间戳,但考虑到网络传输时延,时间戳需要有一定的误差容限,这样仍然不 ...
- Linux 高性能服务器编程——I/O复用的高级应用
高级应用一:非阻塞connect connect系统调用的man手册中有如下的一段内容: EINPROGRESS The socket is non-blocking and the connecti ...
- Android下DrawerLayout的使用
Android下DrawerLayout的使用 DrawerLayout见名知意,就是一个具有抽屉效果的布局,看看这个效果图,是不是感觉很炫酷 这么炫的效果其实不一定非要用类似一些SlidingMen ...
- 详解EBS接口开发之供应商导入
(一)供应商常用标准表简介 1.1 常用标准表 如下表中列出了与供应商相关的表和说明: 表名 说明 其他信息 ap_suppliers 供应商头表 供应商的头信息如:供应商名.供应商编码.税号等 ...
- [uwsgi]使用建议(类似最佳实践)
看了下uwsgi官方的一个使用建议,之前都是直接参考了下django文档中那个比较简单的配置或者就写了个能运行的配置,么有注意很多细节问题,这里学习下,把需要的配置添加到项目配置中. 1 http a ...