锁——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
参考文档:
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除了可重入还有哪些特性? 简介 ...
随机推荐
- poj 2528(线段树+离散化) 市长的海报
http://poj.org/problem?id=2528 题目大意是市长竞选要贴海报,给出墙的长度和依次张贴的海报的长度区间(参考题目给的图),问最后你能看见的海报有几张 就是有的先贴的海报可能会 ...
- JavaScript.how-to-debug-javascript
How to debug JavaScript code 1. 写一个HTML文件.例如: <!DOCTYPE html> <html> <title>Web Pa ...
- mysql if--then--else --endif 问题
if 0 =resultValue then set @m = 2; else set @m =1; end if if 0 =resultValue then set @m = 2; else se ...
- node.js 关于 async的使用
第一次使用,感觉有点糊涂,后来实验明白了. 在串行执行中,经常会只做了第一步.后来明白了.是没有把回调函数放在里面简单就是: async.series( { ...
- Java的OOP三大特征之一——多态
OOP(面对对象)三大特征之一——多态 What:多态性是指允许不同类的对象对同一消息作出响应,多态性包括参数化多态性和包含多态性,多态性语言具有灵活.抽象.行为共享.代码共享的优势,很好的解决了应用 ...
- css 需要阴影的效果
box-shadow: 0 0 10px 10px #b9bcbf; CSS3 box-shadow 属性 CSS 参考手册 实例 向 div 元素添加 box-shadow: div { box-s ...
- Ionic学习
1. 原来Http不能直接加在普通类里,下面的报错 import { Component } from '@angular/core'; import { NavController } from ' ...
- 跟我学Spring Boot(三)Spring Boot 的web开发
1.Web开发中至关重要的一部分,Web开发的核心内容主要包括内嵌Servlet容器和SpringMVC spring boot 提供了spring-boot-starter-web 为web开发提 ...
- mysql 5.7 linux环境下解压安装
在CentOS linux环境安装mysql 一般rpm(或者yum),预编译和源码安装. 如果采用rpm或者yum安装,mysql的数据文件一般存放在/var/lib/mysql目录下,也就是会把d ...
- ubuntu samba共享后windows读写文件都是以nogroup问题
添加smb账号 sudo smbpasswd -a xxx 如果报错:Failed to add entry for user xxx 则是因为这个账号不存在 添加成功以后,过一会就可以重新登陆了(u ...