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

LWJ随缘

LWJ随缘

2016-02-19 09:27

今天图老师小编给大家介绍下深入同步访问共享的可变数据分析,平时喜欢深入同步访问共享的可变数据分析的朋友赶紧收藏起来吧!记得点赞哦~
如果对共享的可变数据的访问不能同步,其后果非常可怕,即使这个变量是原子可读写的。
下面考虑一个线程同步方面的问题。对于线程同步,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;
 }
}
展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
深入同步访问共享的可变数据分析

用Excel做数据分析——回归分析

电脑入门
用Excel做数据分析——回归分析

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Excel巧用条件格式做数据分析

excel
Excel巧用条件格式做数据分析

《猎刃》个人精炼数据分析

网络游戏
《猎刃》个人精炼数据分析

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

最新安卓手机市场数据分析

Android
最新安卓手机市场数据分析

教你使用Excel做数据分析之回归分析方法

电脑入门
教你使用Excel做数据分析之回归分析方法

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

我愤恨世俗 看不惯请滚 - QQ图案分组

我愤恨世俗 看不惯请滚 - QQ图案分组

通用的加入收藏夹代码支持IE Firefox等浏览器

通用的加入收藏夹代码支持IE Firefox等浏览器
下拉加载更多内容 ↓