Java编程思想——第21章 并发(二)

三、共享受限资源

  对于并发任务,你需要某种方式来防止两个任务访问相同的资源,至少在关键阶段不能出现这种情况。

1.解决共享资源竞争

  防止这种冲突的方法就是当资源被一个任务使用时,在其上加锁。基本上所有的并发模式在解决线程冲突问题的时候,都是采用序列化访问共享资源的方案。通常这是通过在代码前面加上以挑锁语句来实现的,这使得在一段时间内只有一个任务可以运行这段代码。因为锁语句产生了一种互相排斥的效果,所以这种机制撑场成为互斥量(mutex)。

  synchronized,当代码要执行被synchronized保护的代码块时,先检查锁是否可用,再获得锁,执行代码块,释放锁。共享资源一般是以对象形式存在的内存片段,也可以是文件,I/O,打印机等。要控制对共享资源的访问,需要先把它包装进一个对象。然后把所有调用这个资源的方法标记为synchronized。如果某个任务在调用标记为synchronized的方法,那么那么在这个线程从该方法返回前,其他所有要调用类中任何标记为synchronized方法的线程都会被阻塞。

  对所有对象,自动含有单一锁,当在对象上调用其任意synchronized方法的时候,此对象都被加锁,这时该对象上的其他synchronized方法只有等到前一个方法调用完毕并释放锁后才能被调用。注意,在使用并发时,将域设置为private是非常重要的,否则,synchronized关键字就不能防止其他任务直接访问域。

  对每个类,也有一个锁。所以 synchronized static 方法可以在类的范围内防止对static数据的并发访问。

  

  

  

原文地址:https://www.cnblogs.com/xcgShare/p/11770688.html

时间: 2024-10-31 11:47:03

Java编程思想——第21章 并发(二)的相关文章

Java编程思想 第21章 并发

这是在2013年的笔记整理.现在重新拿出来,放在网上,重新总结下. 两种基本的线程实现方式 以及中断 package thread; /** * * @author zjf * @create_time 2013-12-18 * @use 测试基本的两种线程的实现方式 *         测试中断 */ public class BasicThreadTest { public static void main(String[] args) { Counter c1 = new Counter(

Java编程思想——第17章 容器深入研究(two)

六.队列 排队,先进先出.除并发应用外Queue只有两个实现:LinkedList,PriorityQueue.他们的差异在于排序而非性能. 一些常用方法: 继承自Collection的方法: add 在尾部增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常 remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常 element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementExce

java编程思想笔记(第一章)

Alan Kay 第一个定义了面向对象的语言 1.万物皆对象 2.程序是对象的集合,他们彼此通过发送消息来调用对方. 3.每个对象都拥有由其他对象所构成的存储 4.每个对象都拥有其类型(TYpe) 5.某一特定类型的所有对象都可以接收同样的消息. Booch提出一种更简洁的描述: 对象拥有状态(state) 行为(behavior) 和标识(identity) 每个对象都有一个接口 每个对象都属于定义了特性和行为的某个类(特性可以理解为属性的状态,行为可以理解为method) 在面向对象的程序设

Java编程思想笔记(第二章)

第二章  一切都是对象 尽管Java是基于C++的,但相比之下,Java是一种更纯粹的面向对象程序设计语言. c++和Java都是杂合型语言(hybird language) 用引用(reference)操作对象 类似遥控器(引用)来操作电视(对象) 在Java中你可以创建一个引用,但是没有与任何对象关联,比如: String s; 这个时候如果用则会报错.安全的做法是: 创建一个引用的同时并进行初始化 String s="1111"; 必须由你创建所有对象 New关键字的意思是给我一

Java 编程思想 第五章 ----初始化与清理(1)

从今天开始每天一小时的java 编程思想的阅读和编码,其实就是把书上的代码抄下来. 5.5 清理:终结处理和垃圾回收 初始化和清理工作同等重要,但是清理工作却被常常忘记,但是在使用对象之后,对对象弃之不顾的做法并不是很安全.Java有自己的垃圾回收器负责回收无用的对象占据的内存资源.但也有特殊情况:假定你的内存区域不是用new获得的,这是无法用垃圾回收器释放所以java中允许在类中定义一个名为 finalize()的方法.       工作原理: 一旦垃圾回收器准备好释放对象占用的存储空间,将首

java 编程思想 一 第二章(对象)

上班之余发现有很多空闲时间,享受生活 又觉得有点空虚,而且对自己的基础知识总觉得掌握的不是很牢固,有点似懂非懂的感觉,近来刚好有时间,所以就考虑继续学习,然后再经过考虑和各大博主推荐选择了<java编程思想>这本书,在此分享学习心得跟大家共勉,也算是对自己的监督吧.(本内容需要有一定的基础才能看,类似于基础回顾,强化理解,新手可能有些地方不太能听懂) 一.什么是对象? 这并不是我们男女朋友那种对象哈哈. 简言之:万事万物皆对象. 个人理解:我们所要处理的事务或者建立的某种模型的抽象总结.具体就

java编程思想读书笔记 第十二章 通过异常处理错误(下)

1.异常的限制 当覆盖方法的时候,只能抛出在基类方法的异常说明里列出的那些异常.这意味着,当基类使用的代码应用到其派生类对象的时候,一样能够工资,异常也不例外. 下面的例子是在编译时施加在异常上面的限制: public class BaseBallException extends Exception {} public class Foul extends BaseBallException{} public class Strike extends BaseBallException{} p

《java编程思想》读书笔记(二)第五章(2)

成员初始化 Java尽力保证:所有变量在使用前都能得到恰当的初始化. 对于方法的局部变量,Java会以编译时报错的形式贯彻这种保证,比如: 1 void f() 2 { 3 int i; //这里编译时就会报错,未初始化 4 } 但是如果是类的数据成员,情况会有所不同.类的每个基本类型数据成员会保证一个默认初始值,通常为0,布尔型就是false,引用类型会为null. 指定初始化 (1 直接在类里定义时写变量等于多少(这样在C++中是不允许的)如, public class initialV {

Java编程思想——第14章 类型信息(二)反射

六.反射:运行时的类信息 我们已经知道了,在编译时,编译器必须知道所有要通过RTTI来处理的类.而反射提供了一种机制——用来检查可用的方法,并返回方法名.区别就在于RTTI是处理已知类的,而反射用于处理未知类.Class类与java.lang.reflect类库一起对反射概念进行支持,该类库包含Field.Method以及Constructor(每个类都实现了Member接口).这些类型是由JVM运行时创建的,用来表示未知类种对应的成员.使用Constructor(构造函数)创建新的对象,用ge