- 浏览: 895183 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (687)
- java (127)
- servlet (38)
- struts (16)
- spring (22)
- hibernate (40)
- javascript (58)
- jquery (18)
- tomcat (51)
- 设计模式 (6)
- EJB (13)
- jsp (3)
- oracle (29)
- RUP (2)
- ajax (3)
- java内存管理 (4)
- java线程 (12)
- socket (13)
- path (5)
- XML (10)
- swing (2)
- UML (1)
- JBPM (2)
- 开发笔记 (45)
- Note参考 (15)
- JAXB (4)
- Quartz (2)
- 乱码 (2)
- CSS (2)
- Exception (4)
- Tools (7)
- sqlserver (3)
- DWR (7)
- Struts2 (47)
- WebService (2)
- 问题解决收藏 (7)
- JBOSS (7)
- cache (10)
- easyUI (19)
- jQuery Plugin (11)
- FreeMarker (6)
- Eclipse (2)
- Compass (2)
- JPA (1)
- WebLogic (1)
- powerdesigner (1)
- mybatis (1)
最新评论
-
bugyun:
受教了,谢谢
java 正则表达式 过滤html标签 -
xiongxingxing_123:
学习了,感谢了
java 正则表达式 过滤html标签 -
wanmeinange:
那如果无状态的。对同一个任务并发控制怎么做?比如继承Quart ...
quartz中参数misfireThreshold的详解 -
fanjieshanghai:
...
XPath 元素及属性查找 -
tianhandigeng:
还是没明白
quartz中参数misfireThreshold的详解
所谓的原子量即操作变量的操作是“原子的”,该操作不可再分,因此是线程安全的。
为何要使用原子变量呢,原因是多个线程对单个变量操作也会引起一些问题。在Java5之前,可以通过volatile、synchronized关键字来解决并发访问的安全问题,但这样太麻烦。
Java5之后,专门提供了用来进行单变量多线程并发安全访问的工具包java.util.concurrent.atomic,其中的类也很简单。
下面给出一个反面例子(切勿模仿):
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- import java.util.concurrent.atomic.AtomicLong;
- /**
- * Java线程:新特征-原子量
- *
- * @author leizhimin 2009-11-6 9:53:11
- */
- public class Test {
- public static void main(String[] args) {
- ExecutorService pool = Executors.newFixedThreadPool(2);
- Runnable t1 = new MyRunnable("张三", 2000);
- Runnable t2 = new MyRunnable("李四", 3600);
- Runnable t3 = new MyRunnable("王五", 2700);
- Runnable t4 = new MyRunnable("老张", 600);
- Runnable t5 = new MyRunnable("老牛", 1300);
- Runnable t6 = new MyRunnable("胖子", 800);
- //执行各个线程
- pool.execute(t1);
- pool.execute(t2);
- pool.execute(t3);
- pool.execute(t4);
- pool.execute(t5);
- pool.execute(t6);
- //关闭线程池
- pool.shutdown();
- }
- }
- class MyRunnable implements Runnable {
- private static AtomicLong aLong = new AtomicLong(10000); //原子量,每个线程都可以自由操作
- private String name; //操作人
- private int x; //操作数额
- MyRunnable(String name, int x) {
- this.name = name;
- this.x = x;
- }
- public void run() {
- System.out.println(name + "执行了" + x + ",当前余额:" + aLong.addAndGet(x));
- }
- }
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicLong; /** * Java线程:新特征-原子量 * * @author leizhimin 2009-11-6 9:53:11 */ public class Test { public static void main(String[] args) { ExecutorService pool = Executors.newFixedThreadPool(2); Runnable t1 = new MyRunnable("张三", 2000); Runnable t2 = new MyRunnable("李四", 3600); Runnable t3 = new MyRunnable("王五", 2700); Runnable t4 = new MyRunnable("老张", 600); Runnable t5 = new MyRunnable("老牛", 1300); Runnable t6 = new MyRunnable("胖子", 800); //执行各个线程 pool.execute(t1); pool.execute(t2); pool.execute(t3); pool.execute(t4); pool.execute(t5); pool.execute(t6); //关闭线程池 pool.shutdown(); } } class MyRunnable implements Runnable { private static AtomicLong aLong = new AtomicLong(10000); //原子量,每个线程都可以自由操作 private String name; //操作人 private int x; //操作数额 MyRunnable(String name, int x) { this.name = name; this.x = x; } public void run() { System.out.println(name + "执行了" + x + ",当前余额:" + aLong.addAndGet(x)); } }运行结果:
- 李四执行了3600,当前余额:13600
- 王五执行了2700,当前余额:16300
- 老张执行了600,当前余额:16900
- 老牛执行了1300,当前余额:18200
- 胖子执行了800,当前余额:19000
- 张三执行了2000,当前余额:21000
- Process finished with exit code 0
李四执行了3600,当前余额:13600 王五执行了2700,当前余额:16300 老张执行了600,当前余额:16900 老牛执行了1300,当前余额:18200 胖子执行了800,当前余额:19000 张三执行了2000,当前余额:21000 Process finished with exit code 0
- 张三执行了2000,当前余额:12000
- 王五执行了2700,当前余额:18300
- 老张执行了600,当前余额:18900
- 老牛执行了1300,当前余额:20200
- 胖子执行了800,当前余额:21000
- 李四执行了3600,当前余额:15600
- Process finished with exit code 0
张三执行了2000,当前余额:12000 王五执行了2700,当前余额:18300 老张执行了600,当前余额:18900 老牛执行了1300,当前余额:20200 胖子执行了800,当前余额:21000 李四执行了3600,当前余额:15600 Process finished with exit code 0
- 张三执行了2000,当前余额:12000
- 李四执行了3600,当前余额:15600
- 老张执行了600,当前余额:18900
- 老牛执行了1300,当前余额:20200
- 胖子执行了800,当前余额:21000
- 王五执行了2700,当前余额:18300
- Process finished with exit code 0
张三执行了2000,当前余额:12000 李四执行了3600,当前余额:15600 老张执行了600,当前余额:18900 老牛执行了1300,当前余额:20200 胖子执行了800,当前余额:21000 王五执行了2700,当前余额:18300 Process finished with exit code 0
从运行结果可以看出,虽然使用了原子量,但是程序并发访问还是有问题,那究竟问题出在哪里了?
这里要注意的一点是,原子量虽然可以保证单个变量在某一个操作过程的安全,但无法保证你整个代码块,或者整个程序的安全性。因此,通常还应该使用锁等同步机制来控制整个程序的安全性。
下面是对这个错误修正:
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- import java.util.concurrent.locks.Lock;
- import java.util.concurrent.locks.ReentrantLock;
- import java.util.concurrent.atomic.AtomicLong;
- /**
- * Java线程:新特征-原子量
- *
- * @author leizhimin 2009-11-6 9:53:11
- */
- public class Test {
- public static void main(String[] args) {
- ExecutorService pool = Executors.newFixedThreadPool(2);
- Lock lock = new ReentrantLock(false);
- Runnable t1 = new MyRunnable("张三", 2000,lock);
- Runnable t2 = new MyRunnable("李四", 3600,lock);
- Runnable t3 = new MyRunnable("王五", 2700,lock);
- Runnable t4 = new MyRunnable("老张", 600,lock);
- Runnable t5 = new MyRunnable("老牛", 1300,lock);
- Runnable t6 = new MyRunnable("胖子", 800,lock);
- //执行各个线程
- pool.execute(t1);
- pool.execute(t2);
- pool.execute(t3);
- pool.execute(t4);
- pool.execute(t5);
- pool.execute(t6);
- //关闭线程池
- pool.shutdown();
- }
- }
- class MyRunnable implements Runnable {
- private static AtomicLong aLong = new AtomicLong(10000); //原子量,每个线程都可以自由操作
- private String name; //操作人
- private int x; //操作数额
- private Lock lock;
- MyRunnable(String name, int x,Lock lock) {
- this.name = name;
- this.x = x;
- this.lock = lock;
- }
- public void run() {
- lock.lock();
- System.out.println(name + "执行了" + x + ",当前余额:" + aLong.addAndGet(x));
- lock.unlock();
- }
- }
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.atomic.AtomicLong; /** * Java线程:新特征-原子量 * * @author leizhimin 2009-11-6 9:53:11 */ public class Test { public static void main(String[] args) { ExecutorService pool = Executors.newFixedThreadPool(2); Lock lock = new ReentrantLock(false); Runnable t1 = new MyRunnable("张三", 2000,lock); Runnable t2 = new MyRunnable("李四", 3600,lock); Runnable t3 = new MyRunnable("王五", 2700,lock); Runnable t4 = new MyRunnable("老张", 600,lock); Runnable t5 = new MyRunnable("老牛", 1300,lock); Runnable t6 = new MyRunnable("胖子", 800,lock); //执行各个线程 pool.execute(t1); pool.execute(t2); pool.execute(t3); pool.execute(t4); pool.execute(t5); pool.execute(t6); //关闭线程池 pool.shutdown(); } } class MyRunnable implements Runnable { private static AtomicLong aLong = new AtomicLong(10000); //原子量,每个线程都可以自由操作 private String name; //操作人 private int x; //操作数额 private Lock lock; MyRunnable(String name, int x,Lock lock) { this.name = name; this.x = x; this.lock = lock; } public void run() { lock.lock(); System.out.println(name + "执行了" + x + ",当前余额:" + aLong.addAndGet(x)); lock.unlock(); } }
执行结果:
- 张三执行了2000,当前余额:12000
- 王五执行了2700,当前余额:14700
- 老张执行了600,当前余额:15300
- 老牛执行了1300,当前余额:16600
- 胖子执行了800,当前余额:17400
- 李四执行了3600,当前余额:21000
- Process finished with exit code 0
张三执行了2000,当前余额:12000 王五执行了2700,当前余额:14700 老张执行了600,当前余额:15300 老牛执行了1300,当前余额:16600 胖子执行了800,当前余额:17400 李四执行了3600,当前余额:21000 Process finished with exit code 0
这里使用了一个对象锁,来控制对并发代码的访问。不管运行多少次,执行次序如何,最终余额均为21000,这个结果是正确的。
有关原子量的用法很简单,关键是对原子量的认识,原子仅仅是保证变量操作的原子性,但整个程序还需要考虑线程安全的。
发表评论
文章已被作者锁定,不允许评论。
-
操作系统的目标和作用
2012-07-05 23:46 1342操作系统的目标 目前存在着多种类型的OS,不同类型的OS ... -
利用(ffmpeg)生成视频缩略图(java)
2012-07-01 01:11 0对于上传视频生成缩略图使用的是ffmpeg进行生成的。 自己在 ... -
对Java多线程技术中所有方法的详细解析
2012-06-06 11:32 791一、run()和start() 这两个 ... -
java乱码
2012-06-06 11:33 974自从接触Java和JSP以来, ... -
学习apache commons-io类库中的文件清除器
2011-07-06 23:26 1454学习apache commons-io 1.4类库中的File ... -
java 正则表达式 过滤html标签
2011-05-24 15:10 5358前段时间开发的时候要读取一篇文章的简介内容(也就是前200个字 ... -
转---Eclipse中web-inf和meta-inf文件夹的信息
2011-05-24 13:08 1138Eclipse中web-inf和meta-inf ... -
logback与Log4J的区别
2011-05-17 23:34 1444Logback和log4j是非常相似 ... -
性能优化
2011-04-14 16:10 1192(1)jdbc性能优化 jdbc程序的性能主要由两个因素决定 ... -
JAVA的Random类(转)
2011-04-12 00:21 915Random类中实现的随机算法是伪随机,也就是有规则的随机。在 ... -
非阻塞的Socket链接
2011-04-10 21:59 897import java.io.IOException; ... -
创建临时文件
2011-04-10 21:55 1095package net.java2000.io; ... -
面向对象设计的基本原则
2011-04-07 10:28 1151摘自:http://soft6.com/tech/6/6501 ... -
proxool
2011-04-02 15:01 867属性列表说明: fatal-sql- ... -
当前Java软件开发中几种认识误区
2011-04-01 10:12 884越来越多人开始使用Java ... -
Java中查看一个方法被调用的层次(Reflection、StackTrace)
2011-04-01 00:53 2044package test; public class Mai ... -
反序列化时恢复transient字段
2011-03-30 13:20 1220我们知道将字段设置为transient,可以避免该自动被序列化 ... -
用socket连接服务器直接发送接收邮件
2011-03-22 17:22 1305首页 新闻 论坛 问答 博客 招聘 更多 ▼ 专栏 &l ... -
利用JavaMail收/发Gmail邮件(SSL)
2011-03-22 17:21 2392Gmail目前已经启用了POP3和SMTP服务,具体情况请看 ... -
Java 反射与内省
2011-03-14 22:08 1078一、java反射机制 JAVA反 ...
相关推荐
内容概要:本文档详细列出了标准元素周期表的所有元素,包括每个元素的原子序数、元素符号、元素中文名称、惯用原子量和标准原子量范围,以及部分元素的同位素信息。元素周期表还特别标明了镧系元素和锕系元素,并...
1. 原子量测定的起源:原子量的测定始于19世纪初,由英国化学家约翰·道尔顿提出。道尔顿的原子论是化学史上一个重要的里程碑,他在1803年首次公布了一些元素的原子相对重量,尽管这些数据并不精确,但它们为后续的...
在化学的发展历程中,测定元素原子量的工作一直是基础科学研究的重中之重。美国化学家西奥多·威廉·里查兹(Theodore William Richards)在这一领域所作的贡献,无疑为我们理解元素的化学性质和行为提供了不可或缺...
在高中化学的学习中,原子量和物质量是基础且重要的概念,它们与阿伏加德罗常数密切相关。阿伏加德罗常数是一个在化学领域至关重要的数值,由意大利物理学家阿伏加德罗提出,它定义为12克碳-12同位素中所含碳原子的...
元素周期表(原子量) 2017最新版
本文件是 c++20 规范, vs2019 上的 <atomic> 头文件,带注释。原子量,多线程中保护原子变量
主要给大家介绍了关于C++11中原子量和内存序的相关资料,文中通过示例代码介绍地方非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
C++11原子量在实现自旋锁中的应用 自旋锁是一种低级同步机制,它允许多个线程在尝试访问共享资源时保持活跃,而不是立即进入睡眠状态。自旋锁的核心思想是,当一个线程试图获取锁时,它会不断地检查锁的状态,直到...
在MATLAB编程环境中,"amolwt"是一个用于计算元素原子量或化学物质分子量的M文件。这个功能对于化学、物理以及相关科学领域的计算工作非常有用,特别是涉及到化学反应和分子组成的分析时。下面我们将深入探讨这个...
- **原子量**(Atomic Mass):表示元素的平均原子质量,通常以统一原子质量单位(u)表示。 #### 3. 主族元素示例 - **氢(H)**:原子序数1,原子量1.0079。 - **氦(He)**:原子序数2,原子量4.00。 - **锂(Li...
16. **金属与酸的反应**:金属与酸反应生成氢气,通过金属的质量、酸的浓度和体积,结合原子量的比例关系,可以推算出金属的种类和原子量,以及它们的元素身份。 通过以上知识点的解析,我们可以理解高一化学中关于...
分子式是用来表达分子组成结构的表达式,一般...例如N的原子量为14,H的原子量为1,C的原子量为12,O的原子量为16,因此(NH4)2CO3的分子量为(14+1*4)*2+12+16*3=96。试编写程序求出给定的各个分子式所对应的分子量。
- 原子量可以是同位素的原子量,元素的平均原子量,或近似平均原子量。 - 平均原子量考虑了所有同位素的相对丰度和质量数。 8. 实际应用示例: - 通过不同分子量的比例可以推断元素的同位素种类和比例,如例2中...
1829年,德国科学家德贝莱纳提出了三元素组规则,他发现特定的元素之间存在类似的性质,并且这些三元素组中间元素的原子量往往接近于两端元素原子量的平均值。这一规则为后来元素周期律的发现奠定了基础。 随后,...
道尔顿在1803年提出了原子量的概念,但因为测量方法的不精确,导致原子量的混乱。德贝莱纳在1829年研究了原子量与化学性质的关系,而培顿科弗和格拉斯顿则发现了元素组的规律。 1850年代,类似的研究继续进行,如...
例如,对于水分子(H2O),其分子量为2(氢的原子量)×2 + 16(氧的原子量)= 32.00。这个简单的例子展示了分子量计算器如何简化复杂化学式的计算过程,尤其对于含有多种元素的大分子,手动计算可能会非常繁琐。 ...
在MATLAB环境中进行科学计算和数据分析时,常常需要处理化学元素和化合物的原子量或分子量。"matlab开发-amolwt"项目就是一个专门用于计算这些重量的工具包。这个工具包包含了一些关键的MATLAB脚本和数据文件,帮助...
接着,培顿科弗提出了原子量差为8或其倍数的假设,而尚古多通过《螺旋图》将元素按照原子量排列,发现了化学性质相似的元素出现在同一条直线上。 1864年,德国化学家迈耶尔发表了他的《六元素表》,这是他在化合价...
门捷列夫的周期表成功地预测了元素的性质,如碘的原子量小于其前一个元素溴,这与当时测定的原子量不符,但门捷列夫坚持这一预测,最终被证实正确。 19世纪末,门捷列夫的周期表经过多次修订和完善,尤其是在发现...