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

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

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这里只有精品 | 欧美性色老妇人 | 国产精品二区高清在线 | 亚洲欧洲综合 | 高贵女王调奴vk | 放荡警察巨r麻麻出轨小说 范冰冰特黄xx大片 饭冈加奈子在线播放观看 法国老妇性xx在线播放 | 热辣小秘书办公室 | 日本视频在线观看播放 | 猫咪免费人成网站在线观看入口 | 扒开女人下面使劲桶屁股动漫 | 亚洲是图你懂的 | 色综合天天娱乐综合网 | 日韩视频在线精品视频免费观看 | 热99精品在线 | 免费a视频在线观看 | 日本妇人成熟免费不卡片 | 国产3p绿奴在线视频 | 成人精品视频 成人影院 | japan孕妇孕交freehd | 国语自产拍在线播放不卡 | 日本xxxxxl1820| 成人免费视频在 | 高h短篇合集 | 99爱在线观看精品视频 | 国产精品日韩欧美一区二区 | 久久受www免费人成_看片中文 | blacked亚裔videoshd | 国产精品日韩欧美在线 | 国色天香社区视频免费高清在线观看 | 含羞草传媒网站免费进入欢迎 | 嫩草香味 | 国产成人精品免费视频软件 | 农夫色综合 | 91夜夜人人揉人人捏人人添 | 趴好撅高打屁股sp调教h | 国产午夜精品久久理论片小说 | 国产免费看黄的私人影院 | 国产精品久久久久久福利 | 91男人 | 果冻传媒91 | 免费一级国产大片 |