同步访问共享数据【Effective java第10章】
2017-03-17 22:02
369 查看
在多线程编程时会涉及到共享数据的问题,以下是个人学习的一个小例子。
我们希望程序在一秒后结束,然而第一种却永远不会停止运行。
总结:volatile关键字虽然比synchronized要好用,但是volatile要谨慎使用,因为可能会导致安全性失败。
最佳办法是不共享可变数据,要么共享不可变的数据,要么压根不共享。
我们希望程序在一秒后结束,然而第一种却永远不会停止运行。
import java.math.BigDecimal; import java.util.concurrent.TimeUnit; public class StopThread { // private static boolean stopRequested ; // public static void main(String[] args) throws InterruptedException { // Thread backgroundThread=new Thread(new Runnable() { // // @Override // public void run() { // int i=0; // while(!stopRequested){ // i++; // } // } // }); // // backgroundThread.start(); // TimeUnit.SECONDS.sleep(1);//永远不会终止,没有同步,不能保证后台线程何时"看到"主线程对stopRequested值的修改 // stopRequested=true; // } /****************synchronized**********************/ // private static synchronized void requestStop(){ // stopRequested=true; // } // // private static synchronized boolean stopRequested(){ // return stopRequested; // } // public static void main(String[] args) throws InterruptedException { // Thread backgroundThread=new Thread(new Runnable() { // // @Override // public void run() { // int i=0; // while(!stopRequested()){ // i++; // } // } // }); // // backgroundThread.start(); // TimeUnit.SECONDS.sleep(1);//ok // requestStop(); // } /********************volatile*******************/ private static volatile boolean stopRequested ;//可以保证任何一个线程在读取改域的时候都将看到最近刚被写入的值 public static void main(String[] args) throws InterruptedException { Thread backgroundThread=new Thread(new Runnable() { @Override public void run() { int i=0; while(!stopRequested){ i++; } } }); backgroundThread.start(); TimeUnit.SECONDS.sleep(1);//ok stopRequested=true; } }
总结:volatile关键字虽然比synchronized要好用,但是volatile要谨慎使用,因为可能会导致安全性失败。
最佳办法是不共享可变数据,要么共享不可变的数据,要么压根不共享。
相关文章推荐
- java,线程操作,同步访问共享的可变数据
- 多个对象访问共享对象和数据的方式——一道JAVA就业面试题的不同解法
- java基础--线程04--多个线程访问共享对象和数据的方式
- java项目——java中线程共享数据同步解决办法
- 并发-同步访问共享的可变数据
- java多线程学习-多个线程访问对象共享数据的方式
- Java线程同步锁解决共享数据安全
- java中多个线程访问共享数据的方式有哪些
- java多线程-使用ReadWriteLock同步数据访问
- JAVA笔记14__多线程共享数据(同步)/ 线程死锁 / 生产者与消费者应用案例 / 线程池
- Java线程:线程的同步与锁 一、同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏。 例如:两个线程ThreadA、ThreadB都操作同一个对象Foo对
- java中多个线程访问共享数据的方式有哪些
- Java多线程共享数据、同步、通信
- 代码笔记 | 多线程使用queue模块同步访问共享数据
- Java多线程共享数据、同步、通信
- 对共享可变数据的同步访问
- java线程简介(共享对数据的访问)
- Java并发学习之十五——使用读写锁同步数据访问
- 【Effective Java】11、同步访问共享的可变数据
- java读写锁实现数据同步访问