继承的原始设计动机是抽象,即通过继承的做法,我们可以“抽出像的代码”,并把这些代码放到基类里。
抽象类与概念抽象
通过继承,我们不仅可以通过归纳共性,减轻子类里的代码编写量,更可以从代码设计的角度上,通过为一些在逻辑上有从属关系的类建立“继承--从属”这样的关系,来优化代码的结构。
我们可以把一些类的公有特性归纳到抽象类里去,即在抽象类里定义通用的抽象动作。而在各自的子类里,根据不同的特性,实现具体的动作。
Synchronized关键字
关键字synchronized可以作为JAVA方法修饰符,也可以作为JAVA方法内的语句。
被它修饰的代码部分往往被描述为临界区。这使很多人认为,由于代码被syscharonized保护着,因此同一时刻只能有一个线程访问它。
对于JAVA类中的方法,关键字sysnchronized其实并不锁定该方法或该方法的部分代码,它只是锁定对象。
当synchronized被当做方法修饰符的时候,他所取得的lock将被交给方法调用者(某对象)。如果synchronized作用于某对象的引用,则取得的lock将交给该引用所指的对象。
对一个对象进行同步控制到底意味什么呢?它说明调用该方法的线程将会取得对象的lock。持有对象A的lock的线程,如果另外通过synchronized函数或者synchronized语句来申请对象A的lock的线程,在该lock被释放前无法获得满足。
因此,synchronized方法或synchronized区段内的代码在同一时刻下可有多个线程执行,只要是对不同的对象调用该方法。
1. synchronized 方法:通过在方法声明中加入 synchronized关键字来声明 synchronized 方法。如:
public synchronized void accessVal(int newVal);
synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。
这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized)。
在Java中,不光是类实例,每一个类也对应一把锁,这样我们也可将类的静态成员函数声明为 synchronized ,以控制其对类的静态成员变量的访问。
synchronized 方法的缺陷:若将一个大的方法声明为synchronized 将会大大影响效率,典型地,若将线程类的方法 run() 声明为 synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何 synchronized 方法的调用都永远不会成功。当然我们可以通过将访问类成员变量的代码放到专门的方法中,将其声明为 synchronized ,并在主方法中调用来解决这一问题,但是 Java为我们提供了更好的解决办法,那就是 synchronized 块。
2. synchronized 块:通过 synchronized关键字来声明synchronized 块。语法如下:
synchronized(syncObject)
{
//允许访问控制的代码
}
synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。
总的说来,synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。如果再细的分类,synchronized可作用于instance变量、object reference(对象引用)、static函数和class literals(类名称字面常量)身上。
在进一步阐述之前,我们需要明确几点:
A.无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。
B.每个对象只有一个锁(lock)与之相关联。
C.实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。
接着来讨论synchronized用到不同地方对代码产生的影响: 假设P1、P2是同一个类的不同对象,这个类中定义了以下几种情况的同步块或同步方法,P1、P2就都可以调用它们。 1. 把synchronized当作函数修饰符时,示例代码如下: Public synchronized void methodAAA() { //…. } 这也就是同步方法,那这时synchronized锁定的是哪个对象呢?它锁定的是调用这个同步方法对象。也就是说,当一个对象P1在不同的线程中执行这个同步方法时,它们之间会形成互斥,达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却可以任意调用这个被加了synchronized关键字的方法。 上边的示例代码等同于如下代码: public void methodAAA() { synchronized (this) // (1) { //….. } } (1)处的this指的是什么呢?它指的就是调用这个方法的对象,如P1。可见同步方法实质是将synchronized作用于object reference。――那个拿到了P1对象锁的线程,才可以调用P1的同步方法,而对P2而言,P1这个锁与它毫不相干,程序也可能在这种情形下摆脱同步机制的控制,造成数据混乱:( 2.同步块,示例代码如下: public void method3(SomeObject so) { synchronized(so) { //….. } } 这时,锁就是so这个对象,谁拿到这个锁谁就可以运行它所控制的那段代码。当有一个明确的对象作为锁时,就可以这样写程序,但当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的instance变量(它得是一个对象)来充当锁: class Foo implements Runnable { private byte[] lock = new byte[0]; // 特殊的instance变量 Public void methodA() { synchronized(lock) { //… } } //….. } 注:零长度的byte数组对象创建起来将比任何对象都经济――查看编译后的字节码:生成零长度的byte[]对象只需3条操作码,而Object lock = new Object()则需要7行操作码。 3.将synchronized作用于static 函数,示例代码如下: Class Foo { public synchronized static void methodAAA() // 同步的static 函数 { //…. } public void methodBBB() { synchronized(Foo.class) // class literal(类名称字面常量) } } 代码中的methodBBB()方法是把class literal作为锁的情况,它和同步的static函数产生的效果是一样的,取得的锁很特别,是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。 记得在《Effective Java》一书中看到过将 Foo.class和 P1.getClass()用于作同步锁还不一样,不能用P1.getClass()来达到锁这个Class的目的。P1指的是由Foo类产生的对象。 可以推断:如果一个类中定义了一个synchronized的static函数A,也定义了一个synchronized 的instance函数B,那么这个类的同一对象Obj在多线程中分别访问A和B两个方法时,不会构成同步,因为它们的锁都不一样。A方法的锁是Obj这个对象,而B的锁是Obj所属的那个Class。 小结如下: 搞清楚synchronized锁定的是哪个对象,就能帮助我们设计更安全的多线程程序。 还有一些技巧可以让我们对共享资源的同步访问更加安全: 1. 定义private 的instance变量+它的 get方法,而不要定义public/protected的instance变量。如果将变量定义为public,对象在外界可以绕过同步方法的控制而直接取得它,并改动它。这也是JavaBean的标准实现方式之一。 2. 如果instance变量是一个对象,如数组或ArrayList什么的,那上述方法仍然不安全,因为当外界对象通过get方法拿到这个instance对象的引用后,又将其指向另一个对象,那么这个private变量也就变了,岂不是很危险。 这个时候就需要将get方法也加上synchronized同步,并且,只返回这个private对象的clone()――这样,调用端得到的就是对象副本的引用了。
发表评论
-
好文好博链接
2010-07-17 12:02 667好文关于反射 http://www.blogjava.net ... -
设计模式
2010-04-21 19:58 710适配器模式(Adapter): ... -
spring笔记(读spring技术手册)
2009-07-19 22:15 890Bean、消息、事件 Spring的核心是一个容器(Cont ... -
Log4j笔记(摘自javaEye)
2009-07-18 20:00 853Log4j由3个重要的组件构 ... -
Hibernate事务与Cache管理笔记
2009-07-18 14:26 941事务(Transaction)是工作中的基本逻辑单位,可以用于 ... -
读重构笔记
2009-07-04 15:00 698什么是重构? 所谓重构是这样一个过程:在不改变代码外在行为的 ... -
实现DAO工厂类 笔记
2009-06-29 15:50 2342所谓DAO工厂类,它的作用简单地说就是得到DAO类的实例,也可 ... -
Hibernate数据查询笔记
2009-06-22 13:47 817使用Hibernate取得对象有以下几种方法: 1. ... -
接口的作用笔记
2009-06-22 12:56 948接口的引进是为了实现多继承,同时免除C++中的多继承那样的复杂 ... -
hibernate笔记
2009-06-20 23:10 955外连接与预先抓取的区别 首先讲述一个重点,它将贯穿本小节的始 ... -
在web应用中使用FreeMarker
2009-04-07 21:16 889在web应用中使用freeMarker与在java应用中使用F ...
相关推荐
EJB(Enterprise JavaBeans)是Java EE平台中的一个核心组件,用于构建企业级分布式应用程序。EJB 3是其第三个主要版本,发布于2006年,它引入了...如果你正在探索或使用EJB 3,这些摘记和文档将是你宝贵的参考资料。
### Hibrenate 学习摘记 #### Hibernate 概述与基本配置 Hibernate 是一个开源的对象关系映射(ORM)框架,它简化了 Java 应用程序与数据库之间的交互过程。通过将对象模型与数据库模型进行映射,开发人员可以更...
Fluent软件应用过程中的一些比较重要的说明摘记
软考信息系统管理师考试摘记。 项 目 管 理 知 识 体 系(九大管理) INPUT TOOL OUTPUT 4.1 制定项目章程 1、合同(如果适用) 1、项目选择方法 1、项目章程 2、项目工作说明书 2、项目管理方法系 3、事业环境...
自主研修摘记为我们提供了一系列策略,旨在实现这一目标,并且这些策略在教学实践中被证明是行之有效的。 首先,创设情境,激发兴趣是教师与学生接触的第一个环节,也是极为重要的一步。通过结合教材内容和学生心理...
以上摘录自《Effective C++》中的知识点涵盖了C++编程中的许多重要方面,从基础语法到高级特性均有涉及。通过学习这些最佳实践,开发者可以编写出更高效、更健壮、更容易维护的C++代码。这些规则和指导原则不仅适用...
《胡希恕伤寒论坛讲座》摘记.doc
这一技能不仅适用于学术研究,也为学生将来的学习和工作打下坚实的基础。其次,课程目标是让学生学会在Word中进行基本的排版操作。Word是Microsoft Office办公软件中的一款文字处理软件,它可以帮助我们制作出结构...
本文摘记了胡希恕伤寒论坛的讲座要点,总共十八点,涵盖了中医基础理论、方剂学、诊断学等多方面的知识点。 一、温病不能发汗,不能吃泻药,更不能用火攻,只能用白虎汤。 本点讲述了温病的治疗原则,温病不能使用...
Codelife 不止代码 - 自阅读加注标签-技术规划的借鉴 有摘记和感想.md,提供了原文的详细目录大纲,更重要的是给出了自学摘记,记录下诸多感想。 人的学习进步体现在对抽象问题的概括和具体问题的有针对性的见解,...
构建高性能Web站点涉及多个关键领域,包括服务器并发策略、动态内存缓存、动态脚本加速、浏览器缓存、Web服务器缓存以及反向代理缓存。这些策略的优化对于提升网站性能至关重要。 首先,服务器并发策略是提高Web...
了解操作系统的发展过程、基本特征、进程管理、作业调度等概念是计算机科学与技术专业的基础课程内容。 1. 操作系统的发展过程: 操作系统的发展大致经历了以下几个阶段: - 未配置操作系统的计算机系统:最初的...
【高中政治有效课堂教学探究】 尊敬的各位领导,同行们,大家好!我今天要与大家分享的是我在高中政治教学中关于有效课堂教学的一些探索和心得。在农村高中环境下,面对学生素质、师资力量及教学设施的局限,如何...
在当今数字化浪潮的推动下,企业对于高效、用户导向和适应性强的B端产品需求日益增长。Facebook作为互联网界的巨头,在设计B端产品时所遵循的四项基本原则,不仅体现了对用户体验和效率的极致追求,也体现了对产品...
### UNIX系统概述与核心知识点解析 #### 一、UNIX系统简介 UNIX系统是一种多用户、多任务的操作系统,自1969年由AT&T贝尔实验室开发以来,便因其卓越的性能和灵活性而受到广泛欢迎。它不仅在科学研究、教育领域有着...
总之,自贡市绿盛实验学校的课堂教学改革实践,是新时代教育改革的一个缩影,它充分展现了我国基础教育阶段在追求高质量教育过程中所做出的积极探索和不懈努力。通过这样的实践和交流,不仅能够促进教师专业成长,更...
最近在编写 Grace PHP5 Framework 中,我得到很多类的实例化的心得。Grace PHP5 Framework 是一个完全基于 MVC 架构的框架,具有良好的扩展性。它对于类的调用可以说非常的灵活。
斯蒂芬·P·罗宾斯是全球知名的管理学权威,他的著作被广泛应用于商学院的教育和企业培训中。这份“斯蒂芬P罗宾斯管理学笔记”是一份宝贵的考研资料,它涵盖了管理学的核心概念、理论和实践,旨在帮助学生深入理解和...
学校鼓励教师进行个人教研专题研究,提高教师的专业素养,通过论文撰写、信息摘记等方式促进教师成长。此外,学校还组织多种形式的教研活动,如新教师汇报课、教学比武等,以提升教学质量。 在教学设施和资源方面,...