上一页 1 ··· 9 10 11 12 13 14 下一页
摘要: 到底什么时候该同步呢?这个问题的实际意义很强,但是又说不准,因为并发这块说真的,意外性太多了,很多情况都是我们在不知道下莫名其妙发生。有一个原则,就是若一个变量接下来可能被另一个线程读取,或正在读取一个上一次已经被另一个线程写过的变量,那么,必须使用同步,并且,读写线程都必须用相同的锁同步。所以,若在类中有超过一个方法在处理同步数据,那么必须同步所有相关方法,这是最安全的方法,千万不要嫌麻烦,若没有这么做,以后要是出现什么未知错误,那时头更大呢。 阅读全文
posted @ 2012-08-28 17:18 文酱 阅读(272) 评论(0) 推荐(0) 编辑
摘要: 如果我们希望防止多个线程同时访问方法内部的部分代码而不是防止访问整个方法,通过这种方式分离出来的代码段被称为临界区。那么怎么建立临界区?这时就需要关键字synchronized。synchronized必须先指定某个对象,获得该对象的锁,来用来对花括号内的代码进行同步控制,如: synchronized(syncObject){...} 这就是同步控制块,也就是临界区。那么,一如既往的问题就来了,为什么需要同步控制块?同步控制块有什么好处?同步控制块的一个显著的优点就是可以使多个任务访问对象的时间性能得到显著提高,这个性能的体现就在于加锁的时间,同步整个方法,那么在这整个方法执行完前,... 阅读全文
posted @ 2012-08-28 17:17 文酱 阅读(319) 评论(0) 推荐(0) 编辑
摘要: 在并发编程中,线程的概念是非常重要的。说到线程,自然就要提到进程。下面就先厘清这两个概念。进程是运行在自己的地址空间内的自包容的程序,线程是在进程中的一个单一的顺序控制流。因此,单个进程是可以拥有多个线程。所以,这里我们可以知道,进程和线程的区别。 线程是很容易让人跟任务混在一起,事实上,两者根本不是同一个东西,只是经常捆在一起讲。准确的说,任务是由执行线程来驱动的,任务是附着在线程上的。 如何创建线程呢?首先我们必须先定义我们的任务,因为线程是驱动任务的,没有搭乘的任务,就谈不上要去创建线程,就像列车开动,必须指明目的地,否则列车要怎么开啊。定义任务的方式很简单,就是一个实现Run... 阅读全文
posted @ 2012-08-28 17:16 文酱 阅读(283) 评论(0) 推荐(0) 编辑
摘要: volaatile关键字是java中同步机制中一个非常重要的关键字,它保证了可视性。如果一个域被声明为volatile,那么只要对这个域产生写操作,那么所有的读操作都可以看到这个修改。这就是同步,在并发中是非常重要的。如果资源被某个任务修改,但是其他读取这个资源的任务并不知道,那么是会发生问题的,就像你老婆怀孕了,但是在你知道这个消息前,你并不知道她和其他男人上过,那么你得到这个怀孕的消息时,就会发生严重的问题,孩子可能不是你的,但是你并不知道啊!撇开这个我胡乱编造的例子,大家应该可以知道同步的重要性了吧,尤其是男人。 并不是所有对某个域有写操作就要声明为volatile,像是一个任务的... 阅读全文
posted @ 2012-08-28 17:15 文酱 阅读(291) 评论(0) 推荐(0) 编辑
摘要: 这个问题首先必须知道的是,多个任务同时访问同一个资源会出现什么问题?这是很关键的事情,因为如果我们不知道为什么会出现问题,而且也不知道问题是什么样子,就好像是明知对面浓雾里有致命的敌人,但是却无法知道敌人长什么样子,也不知道会从哪里冒出来,说真的,这种感觉很要命,一点也不好玩!那么,我们的敌人到底是谁呢? 多个任务同时竞争同一个资源,就像两个大胖子抢一个浴缸,两辆车抢同一个车位,等等,在现实生活中,这些情况一定会发生严重的争执,而在程序中,就是在运行中,我们永远不知道到底是哪个任务得到资源。哦,真要命,作为程序员,最害怕的情况之一就是我们竟然无法得知自己程序的运行情况!相信每个程序... 阅读全文
posted @ 2012-08-28 17:11 文酱 阅读(1969) 评论(0) 推荐(0) 编辑
摘要: 内部类的构造器必须连接到指向其外围类对象的引用,所以继承内部类时,必须初始化这个引用,而在导出类中,与外围类对象默认的连接必须断绝,以保持外围类与导出类的独立性。如:class InheritInner extends WithInner.Inner{ InheritInner(WithInner with){ with.super(); }}这没有什么好惊讶的,因为内部类的构造器本来就是外围类的,所以导出类的构造器中是明确的将外围类的构造器作为其构造器,这样就只是得到外围类的构造器而并没有得到更多的东西。 阅读全文
posted @ 2012-08-28 17:03 文酱 阅读(212) 评论(0) 推荐(0) 编辑
摘要: 内部类能否在其可见域内定义static数据或方法呢?答案是不行的。为什么呢?想想就知道了,static数据和方法有种说法,叫做类数据和类方法,为什么这么叫?因为他们是作为类的组成部分,在层次上,是与方法等同的地位,因此,内部类是不能拥有static数据和方法的,就像方法不能拥有static一样。但是嵌套类可以。什么是嵌套类?嵌套类就是加上static修饰的内部类,嵌套类的行为和内部类大相径庭,甚至在根本上已经和内部类不一样,但是如果说,只要放在一个类里面定义的类,就是内部类,那么嵌套类确实可以叫做内部类。嵌套类最大的区别,就是它没有外围类的引用!这点在讲static时,就说过,stat... 阅读全文
posted @ 2012-08-28 17:02 文酱 阅读(249) 评论(0) 推荐(0) 编辑
摘要: 内部类为什么能够访问外围类的成员?这个问题是很基本的问题,但是基本归基本,确是很重要,急需解决的问题,因为不明白这个问题,对于内部类本身也会存在很多困扰。内部类能够访问外围类,这是因为内部类有一个指向外围类对象的引用。因为内部类的创建是需要先创建外围类的实例的,内部类在外围类的组成层次上相当于外围类的方法。但是更重要的是,内部类是可以访问外围类的所有成员,包括私有的,这一点正像前面所讲的,因为内部类在创建时需要先创建外围类的实例并取得对其的引用,所以,自然,外围类的所有成员对于内部类来说是公开的。有什么证据能够证明呢?证据就是我们能够在内部类中返回外围类的引用,如:OuterClass... 阅读全文
posted @ 2012-08-28 16:59 文酱 阅读(271) 评论(0) 推荐(0) 编辑
摘要: 内部类,是java中“哇”的特性之一。为什么说它是"哇“,因为每个刚接触的人都一定会说,”哇!“,怎么会有这种奇怪的东西。是的,这的确是一个令人会”哇"的东西,更重要的是,它并不是语言设计者在语言设计上的一个小花招,它的出现,是为了解决java中如何更好的实现多重继承但是又不会出现C++中出现的一些麻烦,而且也确实很好的解决了这个问题。 C++的多重继承是很难用的东西,因为很难保证它的继承行为不会带来问题,尤其是继承的层次越多,就越会出现问题。java作为C++的继承者,自然也在这方面做了非常大的努力,毕竟多重继承的作用依然是相当吸引人的,是不能随便放弃的。 再次强调,这篇 阅读全文
posted @ 2012-08-28 16:56 文酱 阅读(744) 评论(0) 推荐(0) 编辑
摘要: 在java中,final这个关键字相比其他常见修饰词来说,在代码中出现的频率并不是很高,因为其本身的存在就是为了限制,所以除非是必须需要,否则很少有人会在自己的设计中过早引入限制。 用final修饰无法修改的常量,如编译常量,就是用final修饰,定义时必须赋值,还必须是基本数据类型,因为编译常量是插入到我们代码的表达式中,作为右值,必须是确定的。 我们也经常会看到一个域是用static和final来修饰的,说明这段域的存储空间是不能修改的。依照惯例,用大写表示,而且使用下划线来分隔每个单词。 java中也有一种奇怪的现象,就是允许空白final的存在,如:final int i;这不是与开. 阅读全文
posted @ 2012-07-31 00:17 文酱 阅读(243) 评论(0) 推荐(0) 编辑
上一页 1 ··· 9 10 11 12 13 14 下一页