- 浏览: 9274 次
- 性别:
- 来自: 南通
最新评论
-
dhsoiii:
移动应用确实是以后的主流,所以html5最佳的实践是在手机端。 ...
国内外主流的安卓应用商城 -
dhsoiii:
石油-》是有
由浅入深Java线程之uncontrolled exceptions -
Vicky.Hu:
看完顿时醍醐灌顶啊!
遵守equals和hashCode方法的通用约定 (2) -
seaboycs:
此乃神作,作者神人也!
遵守equals和hashCode方法的通用约定 (2) -
Vicky.Hu:
我来抢个2楼,
遵守equals和hashCode方法的通用约定 (1)
文章列表
移动应用开发是大势所趋,手机应用发布最好还是通过主流的App Store,他们提供了良好的平台帮助我们管理,分发应用。附件中搜集了国内外主流的App Market的资源,希望对大家有用。
在并发编程中经常会碰到多个执行线程共享资源的问题。例如多个线程同时读写文件,共用数据库连接,全局的计数器等。如果不处理好多线程之间的同步问题很容易引起状态不一致或者其他的错误。
同步不仅可以阻止一个线程看到对象处于不一致的状态,它还可以保证进入同步方法或者块的每个线程,都看到由同一锁保护的之前所有的修改结果。处理同步的关键就是要正确的识别临界条件(critical section),即多线程访问/修改共享资源的代码块。
关键字synchronized可以保证同一时刻,只有一个线程可以执行某个方法或者某个代码块。 此外Java语言规范保证读写一个变量是原子的,除非long或 ...
一个if/then 结构可以测试命令的返回值是否为0(因为0 表示成功),如果是的话,执行更多命令.
有一个专用命令"["(左中括号,特殊字符).这个命令与test 命令等价,但是出于效率上的考虑,
它是一个内建命令.这个命令把它的参数作为比较表达式或是文件测试,并且根据比较的结果,
返回一个退出码.
((...))和let...结果也能够返回一个退出码,当它们所测试的算术表达式的结果为非0 的时候,
他们的退出码将返回0.
例如:
let "1<2" returns 0 (as "1< ...
单例模式是使用最为普遍的模式之一。它属于创建模式,确保系统中该类型的类只被实例化一次。 也许有误解,认为单例是在jvm进程中只有一个实例,其实是在同一个Classloader下面仅被实例化一次。Singleton通常用来表示本质上唯一的系统组件,比如文件系统,窗口管理器,系统全局的配置之类的。 在Java语言中,单例能带来一些好处: 1. 对于频繁使用的对象,可以省略创建对象所花费的时间,特别对于重量级的对象,可以节省很大的开销。 2. 有new操作的次数减少,对内存的使用频率也会有所降低,减轻GC的负担。 让我们来看单例的一些实现:
实现方法(1):
p ...
前两天翻阅《Effective Java》发现一条提示慎用线程组。ThreadGroup提供的很多功能的实现是有瑕疵的。例如,我们可以调用activeCount获得该组中活动线程的数量,一旦这个数组进行了分配,并用enumerate方法遍历,如果线程数增加了,就有可能忽略掉调用activeCount后新增的线程。关于处理线程组逻辑,可以用线程池的executor代替。
也许ThreadGroup提供的有用的功能之一就是uncaughtException方法了。Java提供了强大的异常处理机制,有些异常可以通过try/catch捕获或者re-throw,这些都是checked excep ...
学过C语言都知道,我们用exit来返回一个状态,Bash也是一样,这样父进程会判断子进程是否可用。 一个良好的习惯就是在脚本结束时都返回状态。成功返回0,非0值一般对应一个错误码。
当一个脚本以不带参数 exit 来结束时,脚本的退出状态就由脚本中最后执行命令来决定.
$?读取最后执行命令的退出码.函数返回后,$?给出函数最后执行的那条命令的退出码.这种给
函数返回值的方法是 Bash 的方法.
让我们看个简单的例子:
#!/bin/bash
ls -l
echo $?
lskdf
echo $?
! true
[yuyzhu@vm10010 experimen ...
Java并发包里面提供了ThreadGroup类可以帮助我们有效地管理线程组。让我们来看一个生动的例子. Java线程组可以有线程对象或者子线程组组成。也就是说ThreadGroup可以是产生线程树。
让我们看一个简单的例子,这个例子模仿一个搜索任务,将启动10个线程遍历获取指定目录下面的excel文件列表,一旦有一个线程完成遍历,将中断其余的9个任务。
import java.io.File;
import java.util.concurrent.TimeUnit;
public class SearchTask implements Runnable {
pri ...
还记得Java并发最佳实践有一条提到尽量不要在线程间共享状态。但我们在实现一个thread或者runnable接口的时候很容易放这个错误,导致一些诡异的问题。
让我们看下面这个例子:
public class UnsafeTask implements Runnable {
private Date startDate;
@Override
public void run() {
startDate = new Date();
System.out.printf("Starting Thread: %s : %s\n", Thread. ...
继承固然非常强大,但我们不能滥用继承,如使用不当,则会引起诸多问题.只有当子类和超类之间确实存在"is-a"关系的时候,使用继承才是恰当的.即便如此,如果子类和超类在不同的包中,并且超类不是为了继承而设计的,那么继承将会是脆弱的.此时,我们应该考虑用包装类,一复合和转发机制来代替继承.
让我们来看个具体的例子: 我们假设程序用了个HashSet, 我们想统计一个HashSet对象创建以来总共加了多少个元素,为了实现这个功能,我们首先考虑继承,然后覆盖原有的实现加个计数:
package com.effective.item16;
import java.ut ...
如前文所述,在覆盖了equals方法的类中,也必须覆盖hashCode方法。否则违反了Object.hashCode的通用约定会导致该类无法和基于散列的集合(HashMap,HashSet和HashTable)一起正常使用。
如下约定内容摘自Object规范:
1. 在应用程序中,只要对象的euqals方法的比较操作所用的信息没有修改,那么对于同一个对象的调用多次hashCode,必须始终如一返回同一个哈希值。
2. 如果两个对象通过equals比较相等,那么它们的哈希值相同。
3. 如果两个对象通过euqals比较不等,他们的哈希值可能相同,取决于hashCode的实现,由 ...
覆盖equals方法和hashCode方法看似简单,但其实不然,如果没有按照jdk的通用规范去覆盖,那么基于这些约定的类将可能无法正常工作,例如基于散列的集合类HashMap和HashSet.
对于值类,我们通常需要覆盖Object.equals方法,因为我们希望通过equals方法知道它们在逻辑上是否相等.相应的这个类的实例可以被用作map的key,或者set的元素的时候才会表现出预期的行为. 对于"值类",枚举是个例外,因为枚举的每个值都是个单例.
在覆盖equals时,必须遵守JavaSE Object的规范:自反性(reflective), 对称性 (sy ...