日期:2011-01-26 02:54:00 来源:本站整理
<b>Java多线程初学者指南(6):慎重操纵volatile关键字</b>[Java编程]
本文“<b>Java多线程初学者指南(6):慎重操纵volatile关键字</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
volatile关键字相信理解Java多线程的读者都很清楚它的作用.volatile关键字用于声明简单范例变量,如int、float、boolean等数据范例.假如这些简单数据范例声明为volatile,对它们的操作就会变成原子级别的.但这有一定的限制.比方,下面的例子中的n就不是原子级别的:
package mythread; public class JoinThread extends Thread { public static volatile int n = 0; public void run() { for (int i = 0; i < 10; i++) try { n = n + 1; sleep(3); // 为了使运行后果更随机,耽误3毫秒 } catch (Exception e) { } } public static void main(String[] args) throws Exception { Thread threads[] = new Thread[100]; for (int i = 0; i < threads.length; i++) // 成立100个线程 threads[i] = new JoinThread(); for (int i = 0; i < threads.length; i++) // 运行方才成立的100个线程 threads[i].start(); for (int i = 0; i < threads.length; i++) // 100个线程都履行完后持续 threads[i].join(); System.out.println("n=" + JoinThread.n); } } |
假如对n的操作是原子级别的,最后输出的后果应当为n=1000,而在履行上面积代码时,很多时侯输出的n都小于1000,这阐明n=n+1不是原子级别的操作.缘由是声明为volatile的简单变量假如当前值由该变量从前的值相关,那么volatile关键字不起作用,也就是说以下的表达式都不是原子操作:
n = n + 1; n++; |
假如要想使这种情形变成原子操作,需求利用synchronized关键字,如上的代码可以改成以下的情势:
package mythread; public class JoinThread extends Thread { public static int n = 0; public static synchronized void inc() { n++; } public void run() { for (int i = 0; i < 10; i++) try { inc(); // n = n + 1 改成了 inc(); sleep(3); // 为了使运行后果更随机,耽误3毫秒 } catch (Exception e) { } } public static void main(String[] args) throws Exception { Thread threads[] = new Thread[100]; for (int i = 0; i < threads.length; i++) // 成立100个线程 threads[i] = new JoinThread(); for (int i = 0; i < threads.length; i++) // 运行方才成立的100个线程 threads[i].start(); for (int i = 0; i < threads.length; i++) // 100个线程都履行完后持续 threads[i].join(); System.out.println("n=" + JoinThread.n); } } |
上面的代码将n=n+1改成了inc(),此中inc办法利用了synchronized关键字举行办法同步.因此,在利用volatile关键字时要慎重,并非只要简单范例变量利用volatile修饰,对这个变量的全部操作都是本来操作,当变量的值由自身的上一个决按时,如n=n+1、n++等,volatile关键字将失效,只有当变量的值和自身上一个值无关时对该变量的操作才是原子级别的,如n = m + 1,这个就是原级别的.所以在利用volatile关键时一定要谨严,假如自己没有掌控,可以利用synchronized来替换volatile.
以上是“<b>Java多线程初学者指南(6):慎重操纵volatile关键字</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论