标签:
在java线程并发处理中,关键字volatile的主要作用是使变量在多个线程间可见。那么volatile到底该怎么用了?我们首先来看一段代码:
public class MyThread1 implements Runnable {
private boolean istag = true;
public boolean isIstag() {
return istag;
}
public void setIstag(boolean istag) {
this.istag = istag;
}
public void print() {
try {
while (istag) {
System.out.println("print()线程名称是:"+Thread.currentThread().getName());
Thread.sleep(1000);
}
} catch (Exception e) {
}
}
@Override
public void run() {
print();
}
}public class MyThread {
public static void main(String[] args) {
MyThread1 m=new MyThread1();
new Thread(m).start();
System.out.println("我要停止循环-->"+Thread.currentThread().getName());
m.setIstag(false);
}
}我们将代码改造下:
public class MyThread1 extends Thread {
private volatile boolean istag = true;
public boolean isIstag() {
return istag;
}
public void setIstag(boolean istag) {
this.istag = istag;
}
@Override
public void run() {
System.out.println("进入run()====");
while (istag) {
System.out.println("线程名称是:"+Thread.currentThread().getName());
}
System.out.println("线程被停止====");
}
}使用了volatile关键字增加了实例变量在多线程之间的可见性。但volatile关键字最致命的缺点是不支持原子性。
关键字synchronized跟volatile进行一下比较:
public class MyThread1 extends Thread {
private volatile static int count;
public void addCount(){
for (int i = 0; i < 100; i++) {
count++;
}
System.out.println("count="+count);
}
@Override
public void run() {
addCount();
}
}public class RunTest {
public static void main(String[] args){
MyThread1[] myArray=new MyThread1[100];
for (int i = 0; i < 100; i++) {
myArray[i]=new MyThread1();
}
for (int i = 0; i < 100; i++) {
myArray[i].start();
}
}
}public class MyThread1 extends Thread {
private static int count;
//需要加static,才达到同步效果
public synchronized static void addCount(){
for (int i = 0; i < 100; i++) {
count++;
}
System.out.println("count="+count);
}
@Override
public void run() {
addCount();
}
}关键字volatile主要使用的场合是在多线程中可以感知实例变量被更改了,并且可以获得最新的值使用,也就是用多线程读取共享变量时可以获得最新的值。
关键字volatile提示线程每次从共享内存中读取变量,而不是从私有内存中读取,这样就保证了同步数据的可见性。但需要注意的是:如果修改实例变量中的数据,比如i++,也就是i=i+1,这样的操作并不是一个原子操作,也就是非线程安全的。表达式i++的实际操作步骤是:
package com.ztz.myThread;
public class Singleton {
private volatile static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance(){
if(instance==null){
synchronized (Singleton.class) {
if(instance==null)
instance = new Singleton();
}
}
return instance;
}
}版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/luckey_zh/article/details/47303981