Java並發與同步,Java並發同步
Java中並發的形式無非是多線程和多進程兩種形式。這兩種形式都是可以利用多核來發揮計算能力的。
先說並發:
多進程意味著同時運行多個JVM,這個代價通常比多線程高,每個JVM都有自己的堆棧、都要分別載入各自的類。但是多進程的好處是“隔離性”更好,一個JVM中的程式在運行時發生故障不會對其他JVM產生很大的影響。而在多線程的情況下,一些致命錯誤可能導致整個JVM掛掉,禍及全體。多線程可以方便地共用記憶體中的內容,這很方便但有時候也會造成混亂,要小心才是。
在說同步:
在Java的線程之間實現同步是很簡單的,用synchronized預就可以實現,再不濟就用java.util.concurrent.locks下提供的鎖。要注意的是加鎖的域或者對象是否正確,以及wait()等操作是會釋放synchronized鎖的。
而進程間的同步就困難一些了,因為進程之間沒有了synchronized這樣的機制來保證一個程式段或者一個對象被串列執行和訪問。一個進程在執行時,沒法預支在執行當前指令和執行下一條指令之間的一刹那會發生什麼。比如你建立了一個檔案:
File file = new File("123");if (file.exists()) // do something on the file
看似你是檢查檔案已存在,然後做了一些讀寫之類的操作,萬無一失的樣子。但實際上,在執行完exists()方法返回true之後的那一刹那,這個檔案可能就被刪除或者重新命名了。
對於進程之外的很多資源,都存在這樣的情況。這就需要通過檔案鎖之類的機制來保證正確的資源共用。可以通過作業系統API實現,也可以利用jdk提供的一些API,例如:
http://www.concretepage.com/java/example-filelock-java-nio-channels
https://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileLock.html