当前位置:  编程技术>java/j2ee

深入同步访问共享的可变数据分析

    来源: 互联网  发布时间:2014-10-26

    本文导语:  如果对共享的可变数据的访问不能同步,其后果非常可怕,即使这个变量是原子可读写的。下面考虑一个线程同步方面的问题。对于线程同步,Java类库提供了Thread.stop的方法,但是这个方法并不值得提倡,因为它本质上是不安...

如果对共享的可变数据的访问不能同步,其后果非常可怕,即使这个变量是原子可读写的。
下面考虑一个线程同步方面的问题。对于线程同步,Java类库提供了Thread.stop的方法,但是这个方法并不值得提倡,因为它本质上是不安全的。使用轮询(Polling)的方式会更好,例如下面这段程序。
代码如下:

import java.util.concurrent.TimeUnit;
public class StopThread {
 /**
  * @param args
  */

 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++;
     System.out.println(i);
    }
   }
  });
  backgroundThread.start();
  TimeUnit.SECONDS.sleep(1);
  stopRequested = true;
 }
}

你可能会认为这个程序在运行大约一秒后,由于主线程把stopRequested设成了true,使得后台的新线程停止,其实不然,因为后台线程看不到这个值的变化,所以会一直无线循环下去,这就是没有对数据进行同步的后果。因此让我们用同步的方式来实现这个任务。
代码如下:

import java.util.concurrent.TimeUnit;
public class StopThread {
 /**
  * @param args
  */

 private static boolean stopRequested;

 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++;
     System.out.println(i);
    }
   }
  });
  backgroundThread.start();
  TimeUnit.SECONDS.sleep(1);
  requestStop();
 }
}

这样就实现了数据的同步,值得注意的是,写方法(requestStop)和读方法(stopRequested)都需要被同步,否则仍然不是真正意义上的同步。
另外,我们可以使用volatile这个变量修饰符来更加简单地完成同步任务。
代码如下:

import java.util.concurrent.TimeUnit;
public class StopThread {
 /**
  * @param args
  */

 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++;
     System.out.println(i);
    }
   }
  });
  backgroundThread.start();
  TimeUnit.SECONDS.sleep(1);
  stopRequested = true;
 }
}

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Java 多线程同步 锁机制与synchronized深入解析
  • 深入多线程之:用Wait与Pulse模拟一些同步构造的应用详解
  • Docker支持更深入的容器日志分析
  • 关于《深入浅出MFC》
  • Linux有没有什么好的高级的书,我要深入,
  • 深入理解linux内核
  • [100分]有没有关于binutils的深入的资料?或者深入底层的资料?
  • 深入理解PHP内核 TIPI
  • 想深入学习Java应该学习哪些东西
  • 哪位有《JSP深入编程》电子版?
  • 想要深入学习LINUX该学什么?
  • 100分求:哪儿有《深入理解linux内核》可供下哉!
  • 如何深入Linux的内核学习?
  • U-BOOT得掌握到什么程序,用不用深入去学
  • 想深入了解操作系统该怎么做
  • 前一阵子学习了shell脚本,如果想深入点了解linux可以看什么书呢
  • 问一个《深入理解计算机系统》中的问题
  • 深入多线程之:深入分析Interlocked
  • ##想买书深入学习linux下的编程,请指教
  • 深入JDBC sqlserver连接写法的详解
  • 深入oracle特定信息排序的分析
  • 深入分析C中不安全的sprintf与strcpy
  • 哪儿有下载《深入理解Linux内核》这本书?(中文)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3