国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩视频久久 | 欧美日韩伊人 | 国产伦乱 | 色婷婷一区二区三区 | 精品久久久久久久久久久 | 精品中文字幕在线 | 精品成人一区 | 91九色视频pron | 精品一区二区三区视频 | 亚洲国产精品电影在线观看 | 日韩高清一区二区 | 九九热精品视频在线观看 | 色综合一区二区三区 | 国产成人精品免费视频大全最热 | 国产精品亚洲成在人线 | 欧美日韩中文字幕在线 | 日韩中文字幕在线播放 | 51国产午夜精品免费视频 | 精品无码久久久久国产 | 国产精品亚洲视频 | 一区二区三区久久 | 亚洲国产精品99久久久久久久久 | 一区二区三区高清不卡 | 色婷婷一区 | 在线观看一区二区三区四区 | 特一级毛片 | 日韩免费一区二区 | 亚洲国产精品一区久久av篠田 | 国产精品欧美一区二区三区 | 中文字幕精品一区二区三区精品 | 91国产精品 | 亚洲日本va中文字幕 | 日本精品在线观看 | 黑人巨大精品欧美一区免费视频 | 精品欧美 | 免费在线观看一区二区三区 | 午夜视频网站 | 国产亚洲精品久久久久久无几年桃 | 91视频导航 | 色婷婷亚洲一区二区三区 | 色偷偷噜噜噜亚洲男人 |