Java無基礎開發Android應用,發現對靜態方法理解不夠,有如下問題:
在多線程中使用靜態方法會發生什麼事?也就是說多線程訪問同一個類的static靜態方法會發生什麼事?是否會發生線程安全問題?
參考: http://my.oschina.net/keyven/blog/219603
結論:
1,在多線程中使用同一個靜態方法時,每個線程使用各自的實例字段(instance field)的副本,而共享一個靜態字段(static field)。所以說,如果該靜態方法不去操作一個靜態成員,只在方法內部使用實例字段(instance field),不會引起安全性問題。
2,加入synchronized關鍵字的靜態方法稱為同步靜態方法。
在訪問同步靜態方法時,會獲取該類的“Class”對象,所以當一個線程進入同步的靜態方法中時,線程監視器獲取類本身的對象鎖,其它線程不能進入這個類的任何靜態同步方法。它不像實例方法,因為多個線程可以同時訪問不同實例同步實例方法。這個其實就是操作系統中的用信號量實現進程的互斥與同步問題,如果涉及在同一個類中有多個靜態方法中處理多線程共享數據的話,那就變成用信號量解決生產者-消費者問題。也就是說,靜態方法是一份臨界資源,對靜態方法的訪問屬於進入臨界區;對靜態變量的修改是一份臨界資源,對靜態變量的修改屬於進入臨界區。
3,synchronized 與 static synchronized的區別參考: http://blog.csdn.net/baple/article/details/12080597
其他多線程相關問題:
參考:http://www.lupaworld.com/article-218037-1.html
主要:
1,多線程同步是指對共享資源的訪問控制;
2,實現方式有繼承Thread和Runnable,推薦Runnable方便多重繼承;
3,靜態同步方法在進入的時候線程監視器獲取是該方法所在類的對象鎖