了解下JAVA的Java多线程基本总结五:atomic
用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>
大型的应用一般不会用这些框架(因为性能考虑);开发人员根据需要选择用一些框架,也可以不选用框架;不用框架并不代表要自己写框架;修改框架的可能性更小。 学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。 是一种使网页(Web Page)产生生动活泼画面的语言 学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。 其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。 多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。 一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从 你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢? 关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。 多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
页:
[1]