深入同步訪問共享的可變數(shù)據分析
更新時間:2013年06月04日 17:58:47 作者:
本篇文章是對同步訪問共享的可變數(shù)據進行了詳細的分析介紹,需要的朋友參考下
如果對共享的可變數(shù)據的訪問不能同步,其后果非常可怕,即使這個變量是原子可讀寫的。
下面考慮一個線程同步方面的問題。對于線程同步,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,使得后臺的新線程停止,其實不然,因為后臺線程看不到這個值的變化,所以會一直無線循環(huán)下去,這就是沒有對數(shù)據進行同步的后果。因此讓我們用同步的方式來實現(xiàn)這個任務。
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();
}
}
這樣就實現(xiàn)了數(shù)據的同步,值得注意的是,寫方法(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;
}
}
下面考慮一個線程同步方面的問題。對于線程同步,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,使得后臺的新線程停止,其實不然,因為后臺線程看不到這個值的變化,所以會一直無線循環(huán)下去,這就是沒有對數(shù)據進行同步的后果。因此讓我們用同步的方式來實現(xiàn)這個任務。
復制代碼 代碼如下:
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();
}
}
這樣就實現(xiàn)了數(shù)據的同步,值得注意的是,寫方法(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;
}
}
相關文章
基于Java開發(fā)實現(xiàn)ATM系統(tǒng)
這篇文章主要為大家詳細介紹了基于Java開發(fā)實現(xiàn)ATM系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-08-08