double r = Math.cos(Math.PI * theta);In order to get around this, people sometimes put static members into an interface and inherit from that interface. This is a bad idea. In fact, it's such a bad idea that there's a name for it: the Constant Interface Antipattern (see Effective Java Item 17). The problem is that a class's use of the static members of another class is a mere implementation detail. When a class implements an interface, it becomes part of the class's public API. Implementation details should not leak into public APIs.
The static import construct allows unqualified access to static members without inheriting from the type containing the static members. Instead, the program imports the members, either individually:
or en masse:import static java.lang.Math.PI;
Once the static members have been imported, they may be used without qualification:import static java.lang.Math.*;
The static import declaration is analogous to the normal import declaration. Where the normal import declaration imports classes from packages, allowing them to be used without package qualification, the static import declaration imports static members from classes, allowing them to be used without class qualification.double r = cos(PI * theta);
So when should you use static import? Very sparingly! Only use it when you'd otherwise be tempted to declare local copies of constants, or to abuse inheritance (the Constant Interface Antipattern). In other words, use it when you require frequent access to static members from one or two classes. If you overuse the static import feature, it can make your program unreadable and unmaintainable, polluting its namespace with all the static members you import. Readers of your code (including you, a few months after you wrote it) will not know which class a static member comes from. Importing all of the static members from a class can be particularly harmful to readability; if you need only one or two members, import them individually. Used appropriately, static import can make your program more readable, by removing the boilerplate of repetition of class names.
我想计算Z业的兄弟们对标题的这两个词恐怕都不陌生吧Q我们会(x)在很多文档中扑ևq两个词Q一般是形容某某pȝ的优点,或者是形容某某架构的优势等{。甚x的时候我们自׃(x)说我们做的项目有很好?#8220;Extensibility”?#8220;Scalability”?/p>
更有的是,q两个词l常?x)出现在描述同一事物上,而且单词?x)紧挨着。我估计以英语ؓ(f)母语的h?x)明白这二者到底指的是什么意思,但是׃中国的IT人士是否能明白二者到底是什么意思呢Q?/p>
乍一译q来QExtensibility?#8220;可扩展?#8221;Q而Scalability也可以翻译成“可扩展?#8221;或?#8220;规模可扩展?#8221;。反正我是这么翻译的。这么一看,q二者不意思差不多嘛!那干嘛还用两个词阿?写一个算了?/p>
而实际ƈ非如此,虽然Extensibility和Scalability译成中文很相近Q但是二者却有着截然不同的内c(din)?/p>
Extensibility, 表明pȝ设计的原则,考虑C来对系l实现的更改和增强。如果一个系l有很好的ExtensibilityQ那么当对该pȝ某部分进行功能的d或修Ҏ(gu)Q几乎不?x)媄响到pȝ现有的其他部分?/strong>
Scalability, 表示的是当对一个系l的d量或工作量增加时Q该pȝ能够用一个优雅的方式来应对,而且辑ֈ了很好的效果。比如,当一个系l在增加了硬件资源之后,它的性能随之也能够成比例的提升,q就表明q个pȝ有很好的Scalability?/strong>
通过上面的解释,我想你差不多能明白二者到底表明什么意思了吧!虽然都有“扩展?#8221;的意思,但是表现的方面可是不相同的?/p>
事务场景是这L(fng)Q?br />
对于同一个银行帐户A内有200元,甲进行提ƾ操?00元,乙进行{帐操?00元到B帐户。如果事务没有进行隔d能会(x)q发如下问题Q?br />
1、第一cM失更斎ͼ(x)首先甲提ƾ时帐户内有200元,同时乙{帐也?00元,然后甲乙同时操作Q甲操作成功取走100元,乙操作失败回滚,帐户内最lؓ(f)200元,q样甲的操作被覆盖掉了,银行损失100元?br />
2、脏读:(x)甲取?00元未提交Q乙q行转帐查到帐户内剩?00元,q是甲放弃操作回滚,乙正常操作提交,帐户内最lؓ(f)0元,乙读取了甲的脏数据,客户损失100元?br />
3、虚读:(x)和脏ȝ|是针对于插入操作q程中的d问题Q如丙存?gu)?00元未提交Q这旉行做报表q行l计查询帐户?00元,然后丙提交了Q这旉行再l计发现帐户?00元了Q无法判断到底以哪个为准Q?br />
大家好像觉得l计q个东西肯定是时时更新的Q这U情况很正常Q但是如果统计是在一个事务中的时候就不正怺Q比如我们的一个统计应用需要将l计l果分别输出到电(sh)脑屏q和q程|络某台计算机的盘文g中,Z
提高性能和用户响应我们分?个线E,q时先完成的和后完成的统计数据就可能不一_(d)我们׃知道以哪个ؓ(f)准了?br />
4、不可重复读Q甲乙同时开始都查到帐户内ؓ(f)200元,甲先开始取?00元提交,q时乙在准备最后更新的时候又q行了一ơ查询,发现l果?00元,q时乙就?x)很困惑Q不知道该将帐户改ؓ(f)100q是0?br />
和脏ȝ区别是,脏读是读取前一事务未提交的脏数据,不可重复L重新d了前一事务已提交的数据?br />
5、第二类丢失更新Q是不可重复ȝ一U特例,如上Q乙不做W二ơ查询而是直接操作完成Q帐户内最lؓ(f)100元,甲的操作被覆盖掉了,银行损失100元。感觉和W一cM失更新类伹{?/font>
在多个事务ƈ发做数据库操作的时候,如果没有有效的避免机Ӟ׃(x)出现U种问题。大体上有三U问题,归结如下Q?br />
1、丢失更?br />
如果两个事务都要更新数据库一个字DXQx=100
事务A 事务B
dXQ?00
dXQ?00
写入xQX+100
写入xQX+200
事务l束x=200
事务l束x=300
最后x==300
q种情况事务A的更新就被覆盖掉了、丢׃?br />
丢失更新说明事务q行数据库写操作的时候可能会(x)出现的问题?br />
2、不可重复读
一个事务在自己没有更新数据库数据的情况Q同一个查询操作执行两ơ或多次的结果应该是一致的Q如果不一_(d)p明ؓ(f)不可重复诅R?br />
q是用上面的例子
事务A 事务B
dXQ?00
dXQ?00
dXQ?00
写入xQX+100
dXQ?00
事务l束x=200
事务l束x=200
q种情况事务A多次dx的结果出C不一_(d)即ؓ(f)不可重复诅R?br />
再有一情况是qd
事务Aȝ时候读Z15条记录,事务B在事务A执行的过E中删除Q增加)?条,事务A再读的时候就变成?4Q?6Q条Q这U情况就叫做qd诅R?br />
不可重复读说明了做数据库L作的时候可能会(x)出现的问题?br />
3、脏读(未提交读Q?br />
防止一个事务读到另一个事务还没有提交的记录?br />
如:(x)
事务A 事务B
dXQ?00
写入xQX+100
dXQ?00
事务回滚x=100
dXQ?00
事务l束x=100
x?排他?被加锁的对象只能被持有锁的事务读取和修改Q其他事务无法在该对象上加其他锁Q也不能d和修改该对象
s?׃n?被加锁的对象可以被持锁事务读取,但是不能被修改,其他事务也可以在上面再加s锁?br />
锁协议Q?br />
一U封锁协议:(x)
在事务修Ҏ(gu)据的时候加x锁,直到事务l束Q提交或者回滚)释放x锁。一U封锁协议可以有效的防止丢失更新Q但是不能防止脏M可重复读的出现?br />
二锁协议Q?br />
在一U封锁的基础上事务读数据的时候加s锁,d之后释放。二U封锁协议可以防止丢失更斎ͼ脏读。不能防止不可重复读?br />
三锁协议Q?br />
在一U封锁的基础上事务读数据的时候加s锁,直到事务l束释放。二U封锁协议可以防止丢失更斎ͼ脏读Q不可重复读?/font>