在 java 5.0 提供了 java.util.concurrent (簡稱JUC )包,在此包中增加了在并發編程中很常用 的實用工具類,用于定義類似于線程的自定義子 系統,包括線程池、異步 IO 和輕量級任務框架。 提供可調的、靈活的線程池。還提供了設計用于 多線程上下文中的 Collection 實現等。
??內存可見性(Memory Visibility)是指當某個線程正在使用對象狀態而另一個線程在同時修改該狀態,需要確保當一個線程修改了對象 狀態后,其他線程能夠看到發生的狀態變化。 可見性錯誤是指當讀操作與寫操作在不同的線程中執行時,我們無 法確保執行讀操作的線程能適時地看到其他線程寫入的值,有時甚 至是根本不可能的事情。 我們可以通過同步來保證對象被安全地發布。除此之外我們也可以 使用一種更加輕量級的 volatile 變量。
說了這么多,寫個例子解釋下
class ThreadDemo implements Runnable { PRivate boolean flag = false; // 共享數據 @Override public void run() { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } flag = true; System.out.println("flag==" + isFlag()); } public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; }}public class VolatileTest { public static void main(String[] args) { ThreadDemo threadDemo = new ThreadDemo(); Thread thread = new Thread(threadDemo); thread.start(); while (true) { if (threadDemo.isFlag()) { System.out.println("-------"); break; } } }}輸出的結果:
主線程的數據沒有輸出,JVM也沒停下來
為什么會輸出這樣的結果?看下圖 
怎么解決這個問題呢?
while (true) { synchronized (threadDemo) { if (threadDemo.isFlag()) { System.out.println("-------"); break; } } }同步鎖可以解決這個問題,但是效率低,因為在多個線程操作這段代碼,線程會進入阻塞狀態;
private volatile boolean flag = false; // 共享數據Volitale關鍵字同步變量
輸出的結果 
可以看到主線程和子線程都輸出了結果。
Java 提供了一種稍弱的同步機制,即 volatile 變量,用來確保將變量的更新操作通知到其他線程。可以將 volatile 看做一個輕量級的鎖,但是又與鎖有些不同: - 對于多線程,不是一種互斥關系 - 不能保證變量狀態的“原子性操作”
新聞熱點
疑難解答