锁——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除了可重入还有哪些特性? 简介 ...
随机推荐
- js对象(BOM部分/DOM部分)
JS总体包括ECMAScript,DOM,BOM三个部分,但是能够和浏览器进行交互的只有DOM和BOM,那么到底什么是DOM和BOM呢 概念 BOM(Browser Object Model)是指浏览 ...
- (O)js核心:作用域链
作用域 在一个函数被调用的时候,函数的作用域才会存在.此时,在函数还没有开始执行的时候,开始创建函数的作用域: 函数作用域的创建步骤: 1.函数形参的声明. 2.函数变量的声明. 3.普通变量的声 ...
- H5C3动画
1 渐变 /* 渐变:不同颜色之间的柔和过渡 线性渐变:沿着某条直线发生渐变效果 注意:渐变准备来说是一张背景图 语法:linear-gradient */ background-image: lin ...
- Servlet API
Servlet API的查询网址:通过Tomcat的官网链接找到 可见,Servlet API有4个packages javax.servlet // 包含定义Servlet和Servlet容器之间契 ...
- c++11 并发 条件变量 超时等待的代码练习
资料地址 http://en.cppreference.com/w/cpp/thread/condition_variable/wait_until http://www.cnblogs.com/ha ...
- sql2005性能优化(在32位系统上突破2G内存使用量的方法) .
转载自http://blog.csdn.net/soldierluo/article/details/6589743 服务器磁盘为(SAS)IBM组成RAID0+1,SQL2K5只识别4G内存,实际只 ...
- JS代码判断浏览器类型以及版本
browserVersion:function(){ var explorer = window.navigator.userAgent; if (explorer.indexOf("MSI ...
- Element ui 使用 Tree 树形控件
使用树形控件需要映入 jsx才能运行链接:https://github.com/vuejs/babel-plugin-transform-vue-jsx#usage npm install\ babe ...
- vue导航栏实时获取URL设置当前样式,刷新也存在!
很low 别喷, template代码: <div class="tab-itme"> <ul @click="clickit()"> ...
- oracle in 多个字段
oracle 使用in的时候使用多个字段 这个也是刚需啊. 最近有个需求,在一堆商品里面过滤出一些特定的商品类型.供应商的商品(同时满足). 需要的数量不多,但是可能会变化,所以做了两个配置表. 商品 ...