翻译人员: 铁锚
翻译时间: 2013年11月13日

原文链接: 
Monitors – The Basic Idea of Java synchronization

如果你上过操作系统课程,你就知道锁(Monitor)是操作系统同步的一个重要概念,在Java中的同步机制也是基于同样的思想.


1. 什么是锁定?

一个锁就如同一座大楼里面的一个特殊房间,这个特殊的房间同一时间只可以被一个客户(线程)所使用(就比如单人化妆间,不理解化妆间的可以搜索 更衣),当然,这个"房间"里通常会有一些数据,以及适量的代码。

图1

如果一个客户想要占用这个特殊的化妆间,他必须先到大厅(Hallway,Entry Set)去排队, 服务员(调度程序)将会依据某种标准(比如,先来后到,FIFO)选出一个客户去使用.如果客户由于某种原因(如等待...)想暂停使用,将会被带到等候室,并在一定时间后的特定时间被再次调度.

图2

总的来说,锁是一种功能单元(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()

相关文章:

  1. Java Thread: notify() and wait() examples
  2. Interview Question – Use Java Thread to Do Math Calculation
  3. Why do we need Generic Types in Java?
  4. Java Thread: Status Diagram

锁——Java同步的基本思想的更多相关文章

  1. 监视锁——Java同步的基本思想

    翻译人员: 铁锚翻译时间: 2013年11月13日原文链接: Monitors – The Basic Idea of Java synchronization如果你上过操作系统课程,你就知道监视锁( ...

  2. 【线程系列四】[转]监听器-java同步的基本思想

    转自:http://ifeve.com/think-in-java-monitor/ 如果你在大学学习过操作系统,你可能还记得监听器在操作系统中是很重要的概念.同样监听器在java同步机制中也有使用, ...

  3. 013-并发编程-java.util.concurrent.locks之-AbstractQueuedSynchronizer-用于构建锁和同步容器的框架、独占锁与共享锁的获取与释放

    一.概述 AbstractQueuedSynchronizer (简称AQS),位于java.util.concurrent.locks.AbstractQueuedSynchronizer包下, A ...

  4. java锁和同步

    Java 语言设计中的一大创新就是:第一个把跨平台线程模型和锁模型应用到语言中去,Java 语言包括了跨线程的关键字synchronized 和 volatile,使用关键字和java类库就能够简单的 ...

  5. 死磕 java同步系列之自己动手写一个锁Lock

    问题 (1)自己动手写一个锁需要哪些知识? (2)自己动手写一个锁到底有多简单? (3)自己能不能写出来一个完美的锁? 简介 本篇文章的目标一是自己动手写一个锁,这个锁的功能很简单,能进行正常的加锁. ...

  6. 死磕 java同步系列之zookeeper分布式锁

    问题 (1)zookeeper如何实现分布式锁? (2)zookeeper分布式锁有哪些优点? (3)zookeeper分布式锁有哪些缺点? 简介 zooKeeper是一个分布式的,开放源码的分布式应 ...

  7. 死磕 java同步系列之redis分布式锁进化史

    问题 (1)redis如何实现分布式锁? (2)redis分布式锁有哪些优点? (3)redis分布式锁有哪些缺点? (4)redis实现分布式锁有没有现成的轮子可以使用? 简介 Redis(全称:R ...

  8. 死磕 java同步系列之ReentrantLock源码解析(二)——条件锁

    问题 (1)条件锁是什么? (2)条件锁适用于什么场景? (3)条件锁的await()是在其它线程signal()的时候唤醒的吗? 简介 条件锁,是指在获取锁之后发现当前业务场景自己无法处理,而需要等 ...

  9. 死磕 java同步系列之ReentrantLock源码解析(一)——公平锁、非公平锁

    问题 (1)重入锁是什么? (2)ReentrantLock如何实现重入锁? (3)ReentrantLock为什么默认是非公平模式? (4)ReentrantLock除了可重入还有哪些特性? 简介 ...

随机推荐

  1. iOS.AutoLayout.2.CustomView-with-AutoLayout

    Custom View Which Support AutoLayout 创建支持AutoLayout的Custom View AutoLayout 通过使view更加的自组织来减轻controlle ...

  2. 爬取掌阅app免费电子书数据

    主要介绍如何抓取app数据及抓包工具的使用,能看到这相信你已经有爬虫基础了 编不下去了,主要是我懒,直接开干吧! 一.使用环境和工具 windows + python3 + Jsonpath + Ch ...

  3. Java中方法的重写

    ★★前提:方法的重写建立在继承关系上★★ 在Java程序中,类的继承关系可以产生一个子类,子类继承父类,它具备了父类所有的特征,继承了父类所有的方法和变量. 所谓方法的重写是指子类中的方法与父类中继承 ...

  4. Ubuntu几种常见乱码解决方法

    一.网页中的flash乱码:        ubuntu默认浏览器是Firefox,但是Ubuntu默认不安装像flash这种带版权的软件,所以当你浏览像youku或网页播放器时,这种带有 flash ...

  5. asp.net web 服务器端全局定时执行任务

    web网站里面,需要每隔1分钟,执行一个任务,并且一直保持这个定时执行状态,可以用如下一个方法:    1,Global.asax里面的 Application_Start ,发生在第一次请求网站的时 ...

  6. jQuery操作(一)

    基本语法:$(selector).action() 寻找元素(重要的选择器和筛选器) 一:选择器 1.1 基本选择器: $("*") $("#id") $(&q ...

  7. SPring中quartz的配置(可以用实现邮件定时发送,任务定时执行,网站定时更新等)

    http://www.cnblogs.com/kay/archive/2007/11/02/947372.html 邮件或任务多次发送或执行的问题: 1.<property name=" ...

  8. openssl RSA加密方法初识

    作为非对称加密算法,有两对密钥 一般用法 加密结果=RSA_EN(数据,公钥); 解密结果=RSA_DE(数据,私钥); RSA填充 (RSA_public_encrypt和RSA_private_d ...

  9. Notepad++语言格式设置,自定义扩展名关联文件格式

    简单粗暴--直接上图

  10. SpringBoot中关于@Enable***的注解详解

    出处:http://blog.csdn.net/qq_26525215 @EnableAspectJAutoProxy @EnableAspectJAutoProxy注解 激活Aspect自动代理 & ...