欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

多線程系統中如何使用靜態變量

林玟書2年前93瀏覽0評論

多線程系統中如何使用靜態變量?

總的結論:java是線程安全的,即對任何方法(包括靜態方法)都可以不考慮線程沖突,但有一個前提,就是不能存在全局變量。如果存在全局變量,則需要使用同步機制。

如下通過一組對比例子從頭講解:

在多線程中使用靜態方法會發生什么事?也就是說多線程訪問同一個類的static靜態方法會發生什么事?是否會發生線程安全問題?

public class Test {

public static void operation(){

// ... do something

}

}

事實證明只要在靜態函數中沒有處理多線程共享數據,就不存在著多線程訪問同一個靜態方法會出現資源沖突的問題。下面看一個例子:

public class StaticThread implements Runnable {

@Override

public void run() {

// TODO Auto-generated method stub

StaticAction.print();

}

public static void main(String[] args) {

for (int i = 0; i < 100; i++) {

new Thread(new StaticThread()).start();

}

}

}

public class StaticAction {

public static int i = 0;

public static void print() {

int sum = 0;

for (int i = 0; i < 10; i++) {

System.out.print("step " + i + " is running.");

sum += i;

}

if (sum != 45) {

System.out.println("Thread error!");

System.exit(0);

}

System.out.println("sum is " + sum);

}

}

實際執行的結果顯示各個線程對靜態方法的訪問是交叉執行的,但是這并不影響各個線程靜態方法print()中sum值的計算。也就是說,在此過程中沒有使用全局變量的靜態方法在多線程中是安全的,靜態方法是否引起線程安全問題主要看該靜態方法是否對全局變量(靜態變量static member)進行修改操作。

在多線程中使用同一個靜態方法時,每個線程使用各自的實例字段(instance field)的副本,而共享一個靜態字段(static field)。所以說,如果該靜態方法不去操作一個靜態成員,只在方法內部使用實例字段(instance field),不會引起安全性問題。

但是,如果該靜態方法操作了一個靜態變量,則需要靜態方法中采用互斥訪問的方式進行安全處理。我們來看一下沒有使用互斥訪問的話會產生怎樣的問題:public class StaticAction {

public static int i = 0;

public static void incValue() {

int temp = StaticAction.i;

try {

Thread.sleep(1);

} catch (Exception e) {

e.printStackTrace();

}

temp++;

StaticAction.i = temp;

}

}

java子線程,多線程系統中如何使用靜態變量