1. 程式人生 > >Java語法細節 - synchronized和volatile

Java語法細節 - synchronized和volatile

可能 並不是 tst 而不是 也有 使用 += test stc

目錄

  • synchronized關鍵字
  • 關鍵字volatile

synchronized關鍵字

synchronized關鍵字鎖住方法和this的不同之處:

public synchronized void MyMethod() {
        /**
         * 1   註意,如果synchronized的是TestClass.class,那麽任何new出來的該類的實例都會被阻塞,該方法對於該類的所有實例都是一個臨界區
         * 2   如果synchronized的是this,那麽只是針對於一個類的具體實例來說,並不是所有的
         * 3   如果在方法命名處,即:public synchronized void MyMethod(),那麽等效於2
         */
        //synchronized (this) {
        try {
            Thread.sleep(10 * 1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //}
    }

關鍵字volatile

? 註意,對於volatile,Java只保證訪問該變量的時候,訪問的是最新的(即直接訪問的內存,而不是拷貝),但是並不保證原子性,但是其也有可能出現臟數據,因為如果使用value++或者value += 1的操作(這些操作均依賴於volatile變量的上一次的值,因為這些操作都不是原子操作),有可能會出現臟數據volatile的另外一個作用是禁止指令的重排序優化。在一般情況下,Java執行語句的順序可能會因為自動優化而修改,詳情見:該博客

Java語法細節 - synchronized和volatile