程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java中對線程間的變量訪問也需要同步控制

Java中對線程間的變量訪問也需要同步控制

編輯:關於JAVA

一個簡單的計數器,本來以為不需要同步保護,後來發現不行,還是得加上。程序:

  public class TestMain {

  int i = 0; //計數器初始值為0

  public static void main(String[] args) {

  TestMain c = new TestMain();

  Worker x = new Worker(c);

  for (int i=0; i<200; i++) { //200個線程

  new Thread(x).start();

  }

  while (true) { //每隔一秒中輸出計數器的值

  System.out.println(c.i);

  try {

  Thread.sleep(1000);

  } catch (InterruptedException e) {

  }

  }

  }

  }

  class Worker implements Runnable {

  TestMain c;

  public Worker(TestMain c) {

  this.c = c;

  }

  public void run() {

  try {

  Thread.sleep((int)(Math.random() * 25)); //隨機Sleep一段時間

  } catch (InterruptedException e) {

  }

  c.i++; //計數器自增 問題在這裡 並發寫入

  }

  }

  上面的程序50%的幾率結果是200,其余的是199,198....

  c.i++一句需要並發保護。

  本來我以為Java裡面++是原子的呢,呵呵。

  解決方法,加上同步控制,或者使用JDK5裡面新增加的AtomicInteger類。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved