激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java Synchronize下的volatile關鍵字詳解

Java Synchronize下的volatile關鍵字詳解

2021-08-23 14:43Ryan kk Java教程

這篇文章主要介紹了Java Synchronize下的volatile關鍵字詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

簡介關鍵詞:Synchronize與volatile

  • Synchronize:無論是對于Synchronize同步方法異或是Synchronize塊,本質(zhì)是對某對象或某類加鎖,讓多線程進行隊列化的有序地同步執(zhí)行。
  • volatile:用于修飾變量。在多線程執(zhí)行過程中,禁止線程從工作內(nèi)存(緩存)中讀取值。

volatile問題拋出:

讓我們看到這樣一個問題,我們設置一個含有boolean標志位的類Test,以及兩個Runable接口實例,分別為MyThread1,MyThread2。
在MyThread1中通過while循環(huán)判斷flag是否更改,如果更改便結(jié)束循環(huán)退出。
在MyThread2中改變flag值。
代碼如下:
Test:

  1. public class Test {
  2. boolean flag = true;
  3. }

MyThread1:

  1. public class MyThread1 implements Runnable{
  2.  
  3. Test test;
  4.  
  5. public MyThread1(Test test){
  6. this.test = test;
  7. }
  8.  
  9. @Override
  10. public void run() {
  11.  
  12. while (test.flag){
  13.  
  14. }
  15.  
  16. System.out.println(Thread.currentThread().getName()+" 我已退出");
  17. }
  18.  
  19. }

MyThread2:

  1. public class MyThread2 implements Runnable{
  2.  
  3. Test test;
  4.  
  5. public MyThread2(Test test){
  6. this.test = test;
  7. }
  8.  
  9. @Override
  10. public void run() {
  11.  
  12. try {
  13. Thread.sleep(3000);
  14. } catch (InterruptedException e) {
  15. e.printStackTrace();
  16. }
  17.  
  18. test.flag = false;
  19.  
  20. }
  21. }

main函數(shù):

  1. public static void main(String[] args) {
  2.  
  3. Test test = new Test();
  4.  
  5. MyThread1 myThread1 = new MyThread1(test);
  6. MyThread2 myThread2 = new MyThread2(test);
  7.  
  8. Thread thread1 = new Thread(myThread1);
  9. Thread thread2 = new Thread(myThread2);
  10.  
  11. thread1.start();
  12. try {
  13. Thread.sleep(1000);
  14. } catch (InterruptedException e) {
  15. e.printStackTrace();
  16. }
  17. thread2.start();
  18.  
  19. }
  • 按照我們常規(guī)的想法,在在Sleep延時之后,Thread2會更改flag的值。而Thread1也會因此退出循環(huán)。
  • 但實際上,Thread1并沒有因此退出循環(huán)。
  • 原因是Thread1并未從內(nèi)存中讀取flag,而是直接從工作內(nèi)存中讀取。所以即便是Thread2已經(jīng)更新了flag的值,但Thread1工作內(nèi)存中的flag也并未更新。所以便導致了Thread1陷入死循環(huán)。

Java Synchronize下的volatile關鍵字詳解

解決方法:

那么如何解決這樣的問題呢?
很簡單,使用volatile關鍵字。讓線程不得不從主內(nèi)存中讀取flag值。

  1. volatile boolean flag = true;

在我們添加volatile關鍵字后,Thread1便可以正常退出。

在Synchronize下的volatile:

此時我們已經(jīng)了解了volatile關鍵字的作用,那么在我們的volatile關鍵字中,Synchronize有著怎樣的作用呢?

volatile問題拋出:

其實在我們實際使用中,volatile其實也是有一些隱患的。
例如:我們創(chuàng)造10條線程,每條線程都使volatile修飾的int常量增加1000000次。

  1. public class MyThread1 implements Runnable{
  2.  
  3. volatile int num = 0;
  4.  
  5. @Override
  6. public void run() {
  7.  
  8. for (int i = 0; i < 1000000; i++) {
  9. num++;
  10. System.out.println(Thread.currentThread().getName()+" "+num);
  11. }
  12.  
  13. }
  14.  
  15. public static void main(String[] args) {
  16.  
  17. MyThread1 myThread1 = new MyThread1();
  18.  
  19. Thread[] arr = new Thread[10];
  20.  
  21. for (int i = 0; i < 10; i++) {
  22. arr[i] = new Thread(myThread1);
  23. }
  24.  
  25. for (int i = 0; i < 10; i++) {
  26. arr[i].start();
  27. }
  28.  
  29. }
  30.  
  31. }

Java Synchronize下的volatile關鍵字詳解

分析:

  • 從結(jié)果中,我們可以看到,num并沒有像我們想象一樣達到10000000。
  • 這是因為volatile所修飾的int變量在自加過程中并非原子操作。這也就是說這個自加的過程可以被打斷。可以被分解為:獲取值,自加,賦值三個步驟。
  • 例如當,num = 0時,Thread1獲取了num的值,并賦值為1,但此時在Thread1還未來得及更新線程的時候,Thread的2以及Thread3已經(jīng)將線程的值更新為2,但Thread1再賦值,num的值又會重新變?yōu)?。
  • 所以,我們便需要在自加的過程中添加Synchronize關鍵字,讓線程實現(xiàn)同步。

結(jié)論:

在我們使用volatile關鍵字時,需要注意操作是否為原子操作,以免造成線程不安全。

擴展:

其實,對于原子操作,Java已經(jīng)提供了Atomic原子類來解決。其中涉及了CAS機制,在不使用Synchronize的情況下,通過比較原值與當前值,不但性能高效,并且也能達到線程安全的目的。

到此這篇關于Synchronize下的volatile關鍵字 的文章就介紹到這了,更多相關Synchronize volatile關鍵字 內(nèi)容請搜索服務器之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/weixin_49422995/article/details/114642289

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 羞羞视频免费视频欧美 | 精品久久久久久综合日本 | 91看片网页版 | 欧美一区2区三区4区公司二百 | 久久久免费| 欧美一级高潮片免费的 | 日韩视频―中文字幕 | 久久精品国产99久久久古代 | 成人羞羞在线观看网站 | 久草在线免费资源站 | 国产在线观看一区二区三区 | 黄色av网站免费看 | 毛片视频免费播放 | 国产午夜免费不卡精品理论片 | a视频在线看 | 圆产精品久久久久久久久久久 | 国产一级不卡毛片 | 国产精品高潮视频 | 亚洲免费高清 | 久久精品一区二区三区四区五区 | 成人艳情一二三区 | 依人在线视频 | 国产成人精品网站 | 欧美在线电影 | 成人三级电影网址 | 男女羞羞的视频 | 黄网站免费在线看 | 九九热久久免费视频 | 毛片一区二区三区四区 | 国产高清成人久久 | 2019中文字幕在线播放 | 久综合 | 色av网址 | 久久成人激情视频 | 特级黄色小说 | 欧美一级久久 | 免费中文视频 | 怦然心动50免费完整版 | 欧美伦理一区二区 | 竹内纱里奈和大战黑人 | 免费观看黄色影片 |