|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
用winrar打包j2ee的程序和用IDE打包应用程序是一样的。按照你的想法,你是不是也希望服务器都整合由一家公司提供呢?
在复杂先容java.util.concurrent.atomic包之前,有个观点要先剽窃熟习一遍:CAS(对照并互换)。如今年夜多半的处置器都供应对并发会见的撑持,这个撑持的反应体例就是供应硬件的指令撑持多处置的特别需求。好比检测大概制止别的处置器的并发会见来更新共享变量的指令。关于Intelx86架构的处置器来讲就是经由过程供应完成CAS大概对照并设置的硬件原语指令集。CAS操纵的三个操纵数:内存地位(V),预期原值(A)和新值(B)。实行的历程一般是:展望内存地点V应当包括值A,假如包括则将值B交换到地位V;不然,不变动任何值,告知地点V确当前值。CAS看待“读-修正-写”的操纵通常为检测这个历程是不是有别的的线程在修正变量,假如有那末此次的CAS操纵失利,能够实验从头举行CAS。讲到这里仿佛感到比Synchronized还庞大,是不是意味着本钱不小呢?谜底是不是。由于它是硬件原生完成的,极其轻量级的无锁同步体例。就仿佛高清解码一样,GPU原僵硬件解码比软解的CPU占用上风那是相称的纷歧样啊!
说到硬件我就想到比来狂能争辩的利用64位操纵体系的上风。如今处置器多半撑持64位,意味着处置器的存放器映照到内存的寻址空间年夜年夜的年夜了,操纵体系64位的架构也许在内存办理上的应战更年夜了,没有好的内存紧缩手艺,年夜内存只能是年夜华侈。同时还暗示假如三方软件开辟者对64位体系内存办理不熟习,软件变渣滓的几率变年夜了。没有好的64位三方软件的昌盛,操纵体系仅仅作为一个支持软件运转的平台无能甚么呢?以是利用上风不在操纵体系自己而在于平台之上的软件。又扯远了,哎...
JDK5今后在java.util.concurrent.atomic包下供应了十几个原子类。罕见的是AtomicInteger,AtomicLong,AtomicReference和它们的数组情势,另有AtomicBoolean和为了处置ABA成绩引进的AtomicStampedReference类,最初就是基于反射的对volatile变量举行更新的有用工具类:AtomicIntegerFieldUpdater,AtomicLongFieldUpdater,AtomicReferenceFieldUpdater。这些原子类实际上可以年夜幅的提拔性能。而且java.util.concurrent内的并发汇合,线程池,实行器,同步器的外部完成大批的依附这些无锁原子类,从而争夺功能的最年夜化。上面经由过程一个复杂的例子看看:
Java代码
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
import java.util.concurrent.atomic.AtomicInteger;
/**
* User: yanxuxin
* Date: Dec 16, 2009
* Time: 10:49:40 PM
*/
public class AtomicCounterSample extends Thread {
private AtomicCounter atomicCounter;
public AtomicCounterSample(AtomicCounter atomicCounter) {
this.atomicCounter = atomicCounter;
}
@Override
public void run() {
long sleepTime = (long) (Math.random() * 100);
try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
atomicCounter.counterIncrement();
}
public static void main(String[] args) throws Exception {
AtomicCounter atomicCounter = new AtomicCounter();
for (int i = 0; i < 5000; i++) {
new AtomicCounterSample(atomicCounter).start();
}
Thread.sleep(3000);
System.out.println("counter=" + atomicCounter.getCounter());
}
}
class AtomicCounter {
private AtomicInteger counter = new AtomicInteger(0);
public int getCounter() {
return counter.get();
}
public void counterIncrement() {
for (; ;) {
int current = counter.get();
int next = current + 1;
if (counter.compareAndSet(current, next))
return;
}
}
}
class AtomicCounter2 {
private volatile int counter;
private static final AtomicIntegerFieldUpdater<AtomicCounter2> counterUpdater = AtomicIntegerFieldUpdater.newUpdater(AtomicCounter2.class, "counter");
public int getCounter() {
return counter;
}
public int counterIncrement() {
// return counter++;
return counterUpdater.getAndIncrement(this);
}
}
<p>
大型的应用一般不会用这些框架(因为性能考虑);开发人员根据需要选择用一些框架,也可以不选用框架;不用框架并不代表要自己写框架;修改框架的可能性更小。 |
|