标签:
在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