java多线程中的volatile和synchronized用法分析
本文实例分析了java多线程中的volatile和synchronized用法。分享给大家供大家参考。具体实现方法如下:
public class volatiletest extends thread {
private static int count = 0;
public void run() {
count++;
}
public static void main(string[] args) {
thread threads[] = new thread[10000];
for (int i = 0; i < threads.length; i++) {
threads[i] = new volatiletest();
}
for (int i = 0; i < threads.length; i++) {
threads[i].start();
}
try {
thread.sleep(1000);
} catch (interruptedexception e) {
e.printstacktrace();
}
system.out.println(count);
}
}
代码如上,期待输出的是10000,然后,由于count++不是线程安全的,所以输出经常会小于10000.
为了解决这个问题,增加了volatile关键字。
public class volatiletest extends thread {
private volatile static int count = 0;
public void run() {
count++;
}
public static void main(string[] args) {
thread threads[] = new thread[10000];
for (int i = 0; i < threads.length; i++) {
threads[i] = new volatiletest();
}
for (int i = 0; i < threads.length; i++) {
threads[i].start();
}
try {
thread.sleep(2000);
} catch (interruptedexception e) {
e.printstacktrace();
}
system.out.println(count);
}
}
修改之后,还经常输出不是10000的值。
修改为synchronized形式,代码如下:
public class synchronizedtest extends thread {
private static int count = 0;
public void run() {
synchronized (lockclass.lock) {
count++;
}
}
public static void main(string[] args) {
thread threads[] = new thread[10000];
for (int i = 0; i < threads.length; i++) {
threads[i] = new synchronizedtest();
}
for (int i = 0; i < threads.length; i++) {
threads[i].start();
}
try {
thread.sleep(2000);
} catch (interruptedexception e) {
e.printstacktrace();
}
system.out.println(count);
}
}
public class lockclass {
public static byte[] lock = new byte[0];
}
这样修改之后,输出是10000.
这样是否说明volatile这个关键字完全没用呢?只有synchronized才能保证线程安全?
说明:
java语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分。
也就是说,在某些情况下,volitile比synchronized用起来更方便,当然,同步性更差一点。
希望本文所述对大家的java程序设计有所帮助。
推荐阅读
-
java多线程中的volatile和synchronized用法分析
-
java 中数据库连接的JDBC和驱动程序的深入分析
-
详解java中的互斥锁信号量和多线程等待机制
-
java中堆和栈的区别分析
-
Java中对AtomicInteger和int值在多线程下递增操作的测试
-
java编程思想中对synchronized的一点解释: 博客分类: JAVA面试题 编程Java多线程thread制造
-
java编程思想中对synchronized的一点解释: 博客分类: JAVA面试题 编程Java多线程thread制造
-
Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
-
java中栈和队列的实现和API的用法(详解)
-
C#中OpenFileDialog和PictrueBox的用法分析