文章列表
线程安全往往需要靠互斥锁机制来保证,ReentrantLock是比关键字sychronized更灵活的可重入互斥锁。ReentrantLock在不使用锁(它自己本身就是Lock)和synchronized关键字的前提下,是怎么保证线程安全的呢。
看一下不公平锁实现的lock方法(调用的是Sync(NonfairSync)的lock方法
static final class NonfairSync extends Sync {
private static final long serialVersionUID = 7316153563782823 ...
计划做一个多线程下载的程序,强化一下对多线程的理解。计划第一步先做出一个多线程下载的基本功能,下一步做出断点续传等功能。
1.确定下载核心类的接口,接口代码如下,之前看过一大牛的代码,断点续传写得很不错,但是把URL中文件名的解析等工作都放到了下载类中,我觉得这样会导致这个类多担负了一个任务,而我这里,将URL中文件名的解析放到Client中去做,而Client可能是字符型的客户端,或者GUI,这都不会影响到下载核心类的实现。Client仅依赖于DownloadService这一接口,而DownloadService的具体实现可以变化而不影响Client。比如,我实现了两种Download ...
- 2010-05-19 20:17
- 浏览 601
- 评论(0)
1.You must override hashCode in every class that overrides equals.
如果一个类实现了equals方法却没有实现hashCode方法,那么将这个对象A放入HashMap中,然后new一个与A相等的对象B,在HashMap中查找B,返回值将是null,因为没有实现hashCode方法,导致相等的两个对象返回的hash值不同(因为A==B为false)。
2.JavaSE6中关于hashCode方法的约定:
1)在应用的一次运行过程中,每一次调用hashCode方法的返回值必须是同一个整数,除非equals中使用到的值 ...
- 2010-03-12 22:03
- 浏览 614
- 评论(0)
Item 8: Obey the general contract when overriding equals
Equivalence relation(equals必须满足的性质):
Reflexive: For any non-null reference value x, x.equals(x) must return true. Symmetric: For any non-null reference values x and y, x.equals(y) must return true if and only if y.equals(x) returns tru ...
- 2010-03-08 23:28
- 浏览 643
- 评论(0)
Item 4: Enforce noninstantiability with a private constructor
有些类需要防止用户实例化一个类,比如说java.lang.Math 和java.util.Arrays,Attempting to enforce noninstantiability by making a class abstract does not work.A class can be made noninstantiable by including a private constructor://Noninstantiable utility class
...
- 2009-12-26 16:37
- 浏览 586
- 评论(0)
1.One advantage of static factory methods is that, unlike constructors, they have names.
有时候,一个类有几个不同的构造函数,各个构造函数只能靠参数来区分,编写程序和阅读程序的时候构造子的意义都不明确。而是用静态工厂方法可以明确的知道该构造子的含义,比如BigInteger(int, int, Random),这个构造子返回的可能是一个素数,但是在代码上并没有体现出来,使用BigInteger.probablePrime()静态工厂方法的意义就明确得多了。
2.A second ad ...
Item 1: Consider static factory methods instead of constructors
1.One advantage of static factory methods is that, unlike constructors, theyhave names.
有时候,一个类有几个不同的构造函数,各个构造函数只能靠参数来区分,编写程序和阅读程序的时候构造子的意义都不明确。而是用静态工厂方法可以明确的知道该构造子的含义,比如BigInteger(int, int, Random),这个构造子返回的可能是一个素数,但是在代码上并没 ...
- 2009-12-26 13:32
- 浏览 532
- 评论(0)
最近开心农场非常火,同学用C#模拟鼠标点击操作做了一个小外挂,但是这样做有如下缺点:1、计算机不能做其他事情,2、必须开着浏览器,3、对所有好友点一遍的时间太慢,4、对于开发者来说技术含量低了点,呵呵。
所以 ...
- 2009-12-19 21:34
- 浏览 533
- 评论(0)
1.安装Apache HTTP server:http://httpd.apache.org/
2.安装2-3个(或更多)Tomcathttp://tomcat.apache.org/,安装zip版,因为安装多个Windows Service Installer版会出现错误(可以安装一个Installer版,其他两个用zip版)。
3.配置3个Tomcat,使得3个Tomcat在一台 ...
- 2009-11-27 21:14
- 浏览 702
- 评论(0)
还是这个经典场景,但是却能衍生出很多较复杂的SQL语句。学生选课,一个学生表student,课程表course,选课表sc,在MySQL下建立数据库:drop database course_select;
create database course_select;
use course_select;
create table student
(
snum int primary key,
sname varchar(128),
sage int,
sclass varchar(64)
);
create table course
(
cnum int pr ...
- 2009-11-26 09:50
- 浏览 722
- 评论(0)
首先,还是引入一个场景:一家披萨店,有许多的披萨种类(CheezePizza, ClamPizza),在新建一个披萨的时候,很可能会这样做:
public class SimplePizzaFactory {
public static final String CHEEZE_PIZZA = "cheeze";
public static final String CLAM_PIZZ ...
- 2009-11-20 23:14
- 浏览 308
- 评论(0)
考虑这样一个场景:咖啡厅需要做一个订单系统,其中必不可少的功能是:获取每种咖啡的价格以及描述。最初设计如下:
但是,每种咖啡可以根据顾客的选择,添加不同的调料,甚至可能是两份同种调料,例如:牛奶,摩卡,豆浆等。这样,如果采用上面的设计,类图会是这样的:
这样设计的缺陷非常明显:类的数量过于庞大,但是问题还不仅仅如此,当某一个原料的价格上扬了,比如牛奶,那么所有包含牛奶的咖啡的cost方法都需要重新修改,这无疑是一场灾难。
一种改进的设计如下:
这样设计类少多了,但是记住,在软件开发中,永远不变的是“改变”,当下面的情况发生改变时,我们必 ...
- 2009-11-20 14:06
- 浏览 468
- 评论(0)
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新。
考虑这样一个应用:气象站有许多装置来实时监测天气状况,包括温度计,湿度计等。在许多不同的地方有显示屏,要求这些显示屏能够实时查看到气象站所获得的天气数据。并且可以随时增加或者减少显示屏的数量。根据观察者模式,得出如下设计:
观察者模式类图:
要点:
被观察者用一个公共的接口来更新观察者。
观察者与被观察者是松散耦合的,被观察者只需要知道观察者所实现的观察者接口。
许多GUI框架采用观察者模式处理事件。
设计原则:
为交互对象之间的松散耦合设计而努力
- 2009-11-20 13:19
- 浏览 358
- 评论(0)
例子:
一个游戏中有各种鸭子,红头鸭,绿头鸭等等,很自然得出这样的设计:
这时,需求改变了(永远不变的是改变).游戏需要鸭子能飞起来, 在抽象的Duck类中加入一个方法fly(),是一个很自然的想法.
但是,问题出现了,一些不能飞 ...
- 2009-11-16 22:52
- 浏览 397
- 评论(0)
1.通常使用: if (result.size() > 0) return true;
return false; ,但是这样写更简洁:return result.size() > 0;
2. public static Integer valueOf(int i)返回一个表示指定的 int 值的 Integer 实例。如果不需要新的 Integer 实例,则通常应优先使用该方法 ...
- 2009-10-05 13:05
- 浏览 558
- 评论(0)