随笔分类 - 改善Java代码
摘要:思考这样一个案例:
阅读全文
摘要:阻塞队列BlockingQueue扩展了Queue,Collection接口,对元素的插入和提取使用了"阻塞"处理,我们知道Collection下的实现类一般都采用了长度自行管理方式(也就是变长).
阅读全文
摘要:线程死锁DeadLock是多线程编码中最头疼的问题,也是最难重现的问题,因为Java是单进程多线程语言.
阅读全文
摘要:很多编码者都会还说,Lock类和synchronized关键字用在代码块的并发性和内存上时语义是一样的.
阅读全文
摘要:Java的线程池实现从最根本上来说只有两个:ThreadPoolExecutor类和ScheduledThreadPoolExecutor类,这两个类还是父子关系,但是Java为了简化并行计算,还提供了一个Executors的静态类,它可以直接生成多种不同的线程池执行器,比如单线程执行器,带缓冲功能
阅读全文
摘要:在Java1.5之前,实现多线程编程比较麻烦,需要自己启动线程,并关注同步资源,防止线程死锁等问题,在1.5版本之后引入了并行计算框架,大大简化了多线程开发. 我们知道线程有5个状态:新建状态(New),可运行状态(Runnable,也叫做运行状态),阻塞状态(Blocked),等待状态(Waiti
阅读全文
摘要:多线程有两种实现方式: 一种是实现Runnable接口,另一种是继承Thread类,这两种方式都有缺点,run方法没有返回值,不能抛出异常(这两个缺点归根到底是Runable接口的缺陷,Thread也是实现了Runnable接口),如果需要知道一个线程的运行结果就需要用户自行设计,线程类自身也不能提
阅读全文
摘要:线程的优先级(priority)决定了线程获得CPU运行的机会,优先级越高获得的运行机会越大,优先级越低获得的机会越小.Java的线程有10个级别(准确的说是11个级别,级别为0的线程是JVM,应用程序不能设置该级别) 那是不是级别为10的线程肯定比级别为9的线程优先运行呢? 看代码: 该多线程类实
阅读全文
摘要:线程启动完毕后,在运行可能需要终止,Java提供的终止方法只有一个stop,但是不建议使用此方法,因为它有以下三个问题: (1)stop方法是过时的 从Java编码规则来说,已经过时的方式不建议采用. (2)stop方法会导致代码逻辑不完整 stop方法是一种"恶意" 的中断,一旦执行stop方法,
阅读全文
摘要:多线程比较简单的方式是继承Thread类,然后覆写run()方法,在客户端程序中通过调用对象的start方法即可启动一个线程,这个是多线程程序的标准写法. 错误代码: 这是一个错误的多线程应用,main方法根本没有启动一个子线程,整个应用程序中,只有一个主线程在运行,并不会创建任何其他的线程. 只要
阅读全文
摘要:异常原本是正常逻辑的补充,但是有时候会被当做主逻辑使用.看如下代码: 判断一个枚举是否包含指定的枚举项,这里会根据valueOf方法是否抛出异常来进行判断,如果抛出异常(一般是IllegalArgumentException异常),则认为是不包含,若不抛出异常则可以认为包含该枚举项,看上去这段代码很
阅读全文
摘要:AOP(Aspect Oriented Programming面向切面编程)可以很轻松的控制一个方法调用哪些类,也能够控制哪些方法允许被调用,一般来说切面编程(比如AspectJ)只能控制到方法级别,不能实现代码级别的植入(Weave),比如一个方法被类A的m1方法调用时返回1,在类B的m2方法调用
阅读全文
摘要:Java的异常机制有三种: 一.Error类以及其子类表示的是错误,它是不需要程序员处理也不能处理的异常.比如VirtualMachineError虚拟机错误,ThreadDeath线程僵尸等. 二.RuntimeException类及其子类表示的是非受检查异常,是系统可能会抛出的异常,程序员可以去
阅读全文
摘要:在finally代码块中处理返回值,这是在面试题中经常出现的题目.但是在项目中绝对不能再finally代码块中出现return语句,这是因为这种处理方式非常容易产生"误解",会严重误导开发者. 对于以上代码,有两个问题: ①main方法中的doStuff方法的返回值是什么? ②duStuff方法永远
阅读全文
摘要:建议98:建议采用的顺序是 List<T>、List<?>、List<Object> List<T>、List<?>、List<Object>这三者都可以容纳所有的对象,但使用的顺序应该是首选List<T>,次之List<?>,最后选择List<Object>,原因如下: (1) List<T>是确
阅读全文
摘要:JavaAPI提供的异常都是比较低级别的,低级别是指只有开发人员才能看懂的异常.而对于终端用户来说基本上就是天书,与业务无关,是纯计算机语言的描述. 异常封装的三方面的好处: 1)提高系统的友好性 2)提高性能的可维护性 3)解决java异常机制自身的缺陷 (1) 提高系统的友好性. 打开一个文件,
阅读全文
摘要:一、分析 一、分析 一般来说,我们经常使用的枚举项只有一个属性,即排序号,其默认值是从0、1、2... ...。但是除了排序号外,枚举还有一个(或多个)属性:枚举描述,它的含义是通过枚举的构造函数,声明每个枚举项(也就是枚举实例)必须具有的属性和行为,这是对枚举项的描述或补充,目的是使枚举项表述的意
阅读全文
摘要:建议41: 让多重继承成为现实 在Java中一个类可以多重实现,但不能多重继承,也就是说一个类能够同时实现多个接口,但不能同时继承多个类。但有时候我们确实需要继承多个类,比如希望拥有两个类的行为功能,就很难使用单继承来解决问题了(当然,使用多层继承是可以解决的)。幸运的是Java中提供的内部类可以曲
阅读全文
摘要:覆写equals方法必须覆写hashCode方法,这条规则基本上每个Javaer都知道,这也是JDK API上反复说明的,不过为什么要这样做呢?这两个方法之间有什么关系呢?本建议就来解释该问题,我们先来看如下代码: 代码中的Person类与上一建议相同(http://www.cnblogs.com/
阅读全文
摘要:建议47: 在equals中使用getClass进行类型判断 本节我们继续讨论覆写equals的问题。这次我们编写一个员工Employee类继承Person类,这很正常,员工也是人嘛,而且在JEE中JavaBean有继承关系也很常见,代码如下: 输出结果: 很不给力嘛,p1竟然等于e1,也等于e2,
阅读全文

浙公网安备 33010602011771号