1. 程式人生 > >volatile與synchronized有什麽區別?

volatile與synchronized有什麽區別?

當前 使用 ros zed ati size run方法 優化 VM


下列說法正確的是()?

  A.我們直接調用Thread對象的run方法會報異常,所以我們應該使用start方法來開啟一個線程

  B.一個進程是一個獨立的運行環境,可以被看做一個程序或者一個應用。而線程是在進程中執行的一個任務。Java運行環境是一個包含了不同的類和程序的單一進程。線程可以被稱為輕量級進程。線程需要較少的資源來創建和駐留在進程中,並且可以共享進程中的資源

  C.synchronized可以解決可見性問題,volatile可以解決原子性問題

  D.ThreadLocal用於創建線程的本地變量,該變量是線程之間不共享的

答案:B D

解析:synchronized很強大,既可以保證可見性,又可以保證原子性,而volatile不能保證原子性!

volatile與synchronized的區別:

volatile本質是在告訴jvm當前變量在寄存器中的值是不確定的,需要從主存中讀取,synchronized則是鎖定當前變量,只有當前線程可以訪問該變量,其他線程被阻塞住.

volatile僅能使用在變量級別,synchronized則可以使用在變量,方法.

volatile僅能實現變量的修改可見性,但不具備原子特性,而synchronized則可以保證變量的修改可見性和原子性.

volatile不會造成線程的阻塞,而synchronized可能會造成線程的阻塞.

volatile標記的變量不會被編譯器優化,而synchronized標記的變量可以被編譯器優化.

volatile與synchronized有什麽區別?