Java的synchronized使用方法總結
1. 把synchronized當作函數修飾符時,範例程式碼如下:
Public synchronized void method(){ //…. }
這也就是同步方法,那這時synchronized鎖定的是哪個物件呢?他鎖定的是呼叫這個同步方法物件。也就是說,當一個物件P1在不同的執行緒中執行這個同步方法時,他們之間會形成互斥,達到同步的效果。但是這個物件所屬的Class所產生的另一物件P2卻能夠任意呼叫這個被加了synchronized關鍵字的方法。
上邊的範例程式碼等同於如下程式碼:
public void method() { synchronized (this) // (1) { //….. } }
(1)處的this指的是什麼呢?他指的就是呼叫這個方法的對象,如P1。可見同步方法實質是將synchronized作用於object reference。 ――那個拿到了P1物件鎖的線程,才能夠呼叫P1的同步方法,而對P2而言,P1這個鎖和他毫不相干,程式也可能在這種情形下擺脫同步機制的控制,造成數據混亂。
2.同步區塊,範例程式碼如下:
public void method(SomeObject so) { synchronized(so) { //….. } }
這時,鎖就是so這個對象,誰拿到這個鎖誰就能夠運行他所控制的那段程式碼。當有一個明確的物件作為鎖時,就能夠這樣寫程式,但當沒有明確的物件作為鎖,只是想讓一段程式碼同步時,能夠創建一個特別的instance變數(他得是個物件)來充當鎖:
class Foo implements Runnable { private byte[] lock = new byte[0]; // 特别的instance变量 Public void method() { synchronized(lock) { //… } } //….. }
註:零長度的byte數組物件創建起來將比任何物件都經濟――查看編譯後的字節碼:生成零長度的byte[]物件只需3條操作碼,而Object lock = new Object()則需要7行操作碼。
3.將synchronized作用於static 函數,範例程式碼如下:
Class Foo { public synchronized static void method1() // 同步的static 函数 { //…. } public void method2() { synchronized(Foo.class) // class literal(类名称字面常量) } }
程式碼中的method2()方法是把class literal當作鎖的情況,他和同步的static函數產生的效果是相同的,所取得的鎖很特別,是目前呼叫這個方法的物件所屬的類別(Class,而不再是由這個Class產生的某個具體物件了)。
記得在《Effective Java》一書中看過將 Foo.class和 P1.getClass()用來作同步鎖定還不相同,不能用P1.getClass()來達到鎖這個Class的目的。 P1指的是Foo類別產生的物件。
能夠推斷:假如一個類別中定義了一個synchronized的static函數A,也定義了一個synchronized 的instance函數B,那麼這個類別的同一物件Obj在多執行緒中分別存取A和B兩個方法時,不會構成同步,因為他們的鎖都不相同。 A方法的鎖是Obj所屬的那個Class,而B的鎖是Obj所屬的這個物件。
Java的synchronized使用方法小結如下:
#搞清楚synchronized鎖定的是哪個對象,就能幫助我們設計更安全的多執行緒程式。
更有一些技巧能夠讓我們對共享資源的同步存取更加安全:
1. 定義private 的instance變數 他的 get方法,而不要定義public/protected的instance變數。假如將變數定義為public,物件在外界能夠繞過同步方法的控製而直接取得他,並改變他。這也是JavaBean的標準實作方式之一。
2.假如instance變數是個對象,如數組或ArrayList什麼的,那上述方法仍然不安全,因為當外界對象透過get方法拿到這個instance對象的引用後,又將其指向另一個對象,那麼這個private變數也就變了,豈不是很危險。這時候就需要將get方法也加上synchronized同步,並且,只回傳這個private物件的clone()――這樣,呼叫端得到的就是物件副本的參考了。
以上是Java中如何利用synchronized實作同步機制?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

ByteCodeachievesPlatFormIndenceByByByByByByExecutedBoviratualMachine(VM),允許CodetorunonanyplatformwithTheApprepreprepvm.Forexample,Javabytecodecodecodecodecanrunonanydevicewithajvm

Java不能做到100%的平台獨立性,但其平台獨立性通過JVM和字節碼實現,確保代碼在不同平台上運行。具體實現包括:1.編譯成字節碼;2.JVM的解釋執行;3.標準庫的一致性。然而,JVM實現差異、操作系統和硬件差異以及第三方庫的兼容性可能影響其平台獨立性。

Java通過“一次編寫,到處運行”實現平台獨立性,提升代碼可維護性:1.代碼重用性高,減少重複開發;2.維護成本低,只需一處修改;3.團隊協作效率高,方便知識共享。

在新平台上創建JVM面臨的主要挑戰包括硬件兼容性、操作系統兼容性和性能優化。 1.硬件兼容性:需要確保JVM能正確使用新平台的處理器指令集,如RISC-V。 2.操作系統兼容性:JVM需正確調用新平台的系統API,如Linux。 3.性能優化:需進行性能測試和調優,調整垃圾回收策略以適應新平台的內存特性。

javafxeffectife addressemanddressEndressencissencies uningusement insuplatform-agnosticsCenegraphandCsSsStyling.1)itabstractsplactsplatsplatsplatsplatsplatformsthroughascenegraph,確保consistentertrenderingrenderingrenderingacrosswindows,macoswindwind,Macos,MacOs.2)

JVM的工作原理是將Java代碼轉換為機器碼並管理資源。 1)類加載:加載.class文件到內存。 2)運行時數據區:管理內存區域。 3)執行引擎:解釋或編譯執行字節碼。 4)本地方法接口:通過JNI與操作系統交互。

JVM使Java實現跨平台運行。 1)JVM加載、驗證和執行字節碼。 2)JVM的工作包括類加載、字節碼驗證、解釋執行和內存管理。 3)JVM支持高級功能如動態類加載和反射。

Java應用可通過以下步驟在不同操作系統上運行:1)使用File或Paths類處理文件路徑;2)通過System.getenv()設置和獲取環境變量;3)利用Maven或Gradle管理依賴並測試。 Java的跨平台能力依賴於JVM的抽象層,但仍需手動處理某些操作系統特定的功能。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

WebStorm Mac版
好用的JavaScript開發工具