最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入同步訪問共享的可變數(shù)據(jù)分析

 更新時間:2013年06月04日 17:58:47   作者:  
本篇文章是對同步訪問共享的可變數(shù)據(jù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
如果對共享的可變數(shù)據(jù)的訪問不能同步,其后果非??膳?,即使這個變量是原子可讀寫的。
下面考慮一個線程同步方面的問題。對于線程同步,Java類庫提供了Thread.stop的方法,但是這個方法并不值得提倡,因?yàn)樗举|(zhì)上是不安全的。使用輪詢(Polling)的方式會更好,例如下面這段程序。
復(fù)制代碼 代碼如下:

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;
 }
}

你可能會認(rèn)為這個程序在運(yùn)行大約一秒后,由于主線程把stopRequested設(shè)成了true,使得后臺的新線程停止,其實(shí)不然,因?yàn)楹笈_線程看不到這個值的變化,所以會一直無線循環(huán)下去,這就是沒有對數(shù)據(jù)進(jìn)行同步的后果。因此讓我們用同步的方式來實(shí)現(xiàn)這個任務(wù)。
復(fù)制代碼 代碼如下:

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();
 }
}

這樣就實(shí)現(xiàn)了數(shù)據(jù)的同步,值得注意的是,寫方法(requestStop)和讀方法(stopRequested)都需要被同步,否則仍然不是真正意義上的同步。
另外,我們可以使用volatile這個變量修飾符來更加簡單地完成同步任務(wù)。
復(fù)制代碼 代碼如下:

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;
 }
}

相關(guān)文章

最新評論

仁化县| 铜陵市| 濮阳县| 股票| 银川市| 云和县| 久治县| 清涧县| 定远县| 建宁县| 贵阳市| 吉水县| 元氏县| 城固县| 上饶县| 同心县| 靖安县| 商水县| 磐石市| 团风县| 保靖县| 莎车县| 马山县| 临海市| 赤水市| 双桥区| 海淀区| 林甸县| 勐海县| 磐石市| 且末县| 志丹县| 宁陵县| 桐乡市| 永寿县| 饶平县| 永福县| 合肥市| 阿坝| 库伦旗| 斗六市|