一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - java多線程編程之慎重使用volatile關鍵字

java多線程編程之慎重使用volatile關鍵字

2019-11-04 14:04java教程網 JAVA教程

volatile關鍵字相信了解Java多線程的讀者都很清楚它的作用。volatile關鍵字用于聲明簡單類型變量,下面看一下為什么要慎重使用volatile關鍵字

volatile關鍵字相信了解Java多線程的讀者都很清楚它的作用。volatile關鍵字用于聲明簡單類型變量,如int、float、boolean等數據類型。如果這些簡單數據類型聲明為volatile,對它們的操作就會變成原子級別的。但這有一定的限制。例如,下面的例子中的n就不是原子級別的:

復制代碼代碼如下:


package mythread;

 

public class JoinThread extends Thread
{
public static volatile int n = 0;
public void run()
{
for (int i = 0; i < 10; i++)
try
{
n = n + 1;
sleep(3); // 為了使運行結果更隨機,延遲3毫秒

}
catch (Exception e)
{
}
}

public static void main(String[] args) throws Exception
{

Thread threads[] = new Thread[100];
for (int i = 0; i < threads.length; i++)
// 建立100個線程
threads[i] = new JoinThread();
for (int i = 0; i < threads.length; i++)
// 運行剛才建立的100個線程
threads[i].start();
for (int i = 0; i < threads.length; i++)
// 100個線程都執行完后繼續
threads[i].join();
System.out.println("n=" + JoinThread.n);
}
}

 

如果對n的操作是原子級別的,最后輸出的結果應該為n=1000,而在執行上面積代碼時,很多時侯輸出的n都小于1000,這說明n=n+1不是原子級別的操作。原因是聲明為volatile的簡單變量如果當前值由該變量以前的值相關,那么volatile關鍵字不起作用,也就是說如下的表達式都不是原子操作:

復制代碼代碼如下:

n = n + 1;
n++;

 

如果要想使這種情況變成原子操作,需要使用synchronized關鍵字,如上的代碼可以改成如下的形式:

復制代碼代碼如下:


package mythread;

 

public class JoinThread extends Thread
{
public static int n = 0;

public static synchronized void inc()
{
n++;
}
public void run()
{
for (int i = 0; i < 10; i++)
try
{
inc(); // n = n + 1 改成了 inc();
sleep(3); // 為了使運行結果更隨機,延遲3毫秒

}
catch (Exception e)
{
}
}

public static void main(String[] args) throws Exception
{

Thread threads[] = new Thread[100];
for (int i = 0; i < threads.length; i++)
// 建立100個線程
threads[i] = new JoinThread();
for (int i = 0; i < threads.length; i++)
// 運行剛才建立的100個線程
threads[i].start();
for (int i = 0; i < threads.length; i++)
// 100個線程都執行完后繼續
threads[i].join();
System.out.println("n=" + JoinThread.n);
}
}

 

上面的代碼將n=n+1改成了inc(),其中inc方法使用了synchronized關鍵字進行方法同步。因此,在使用volatile關鍵字時要慎重,并不是只要簡單類型變量使用volatile修飾,對這個變量的所有操作都是原來操作,當變量的值由自身的上一個決定時,如n=n+1、n++等,volatile關鍵字將失效,只有當變量的值和自身上一個值無關時對該變量的操作才是原子級別的,如n = m + 1,這個就是原級別的。所以在使用volatile關鍵時一定要謹慎,如果自己沒有把握,可以使用synchronized來代替volatile。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本护士撒尿xxxx欧美 | 美女国内精品自产拍在线播放 | 免费看3d小舞被躁视频网站 | 雪恋电影完整版免费观看 | 性欧美高清强烈性视频 | 成人永久免费 | 99热这里只有精品在线 | 国色天香 社区视频 | 色综合欧美色综合七久久 | 99视频都是精品热在线播放 | 久久99精品涩AV毛片观看 | 四虎在线精品观看免费 | 男人和女人日 | 大香焦在线观看 | 男人女人插 | 青草草产国视频 | 精品国产影院 | 99久久精品久久久久久清纯 | 国产亚洲一区二区三区 | 2048论坛永久入口 原创合集 | 青视频在线 | 色亚州| 亚洲可乐操 | 啾咪成人漫画免费 | 欧美日韩国产另类一区二区三区 | 国色天香社区视频免费观看3 | 亚洲欧美一区二区久久 | 美女扒开粉嫩尿口漫画 | 欧美精品黑人巨大在线播放 | 99在线视频观看 | 西西人体大胆77777视频 | 成人影院免费看 | 国产日韩精品一区二区 | 无码AV熟妇素人内射V在线 | 日韩在线成人 | 色淫阁小说 | 99精品热线在线观看免费视频 | 欧美伊人影院 | 国产欧美一区二区成人影院 | 久久偷拍国2017的 | 美女撒尿毛片免费看 |