程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 深刻同步拜訪同享的可變數據剖析

深刻同步拜訪同享的可變數據剖析

編輯:關於JAVA

深刻同步拜訪同享的可變數據剖析。本站提示廣大學習愛好者:(深刻同步拜訪同享的可變數據剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻同步拜訪同享的可變數據剖析正文


假如對同享的可變數據的拜訪不克不及同步,厥後果異常恐怖,即便這個變量是原子可讀寫的。
上面斟酌一個線程同步方面的成績。關於線程同步,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;
 }
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved