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

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

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

你可能會(huì)認(rèn)為這個(gè)程序在運(yùn)行大約一秒后,由于主線程把stopRequested設(shè)成了true,使得后臺(tái)的新線程停止,其實(shí)不然,因?yàn)楹笈_(tái)線程看不到這個(gè)值的變化,所以會(huì)一直無(wú)線循環(huán)下去,這就是沒有對(duì)數(shù)據(jù)進(jìn)行同步的后果。因此讓我們用同步的方式來(lái)實(shí)現(xiàn)這個(gè)任務(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這個(gè)變量修飾符來(lái)更加簡(jiǎn)單地完成同步任務(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)文章

最新評(píng)論

平泉县| 商河县| 嘉黎县| 银川市| 长乐市| 石阡县| 绥芬河市| 禹州市| 东辽县| 蓬安县| 赤城县| 湄潭县| 花莲市| 德庆县| 囊谦县| 宜春市| 东城区| 南投市| 阿城市| 甘肃省| 行唐县| 镇原县| 玉溪市| 苍山县| 龙井市| 定西市| 五莲县| 霍城县| 三亚市| 治多县| 余干县| 维西| 惠州市| 乌兰浩特市| 霍州市| 沾益县| 焉耆| 平南县| 高台县| 来宾市| 策勒县|