Java中synchronize關鍵字

2021-09-23 18:44:04 字數 1198 閱讀 2362

1. 我們在程式設計的時候偶爾就會遇到併發程式設計的問題,當我們同一時間對於公共的資料部分進行操作的時候就會產生併發問題,這個時候就會造成資料混亂的問題,比如我在更新這個資料的時候還沒有更新完而另外乙個操作取出這個資料那麼取出來的資料就是錯誤的,這也就是我們說的併發問題

併發問題經常發生在多個執行緒對於公共的資料進行操作的時候產生的問題,也就是我們所說的執行緒安全的問題,下面來看一下具體的例子:在main方法中開啟兩個執行緒,兩個執行緒呼叫乙個方法列印出字串,具體的**如下:

public class main  catch (interruptedexception e) 

}}).start();

new thread(new runnable() catch (interruptedexception e)

}}).start(); }

static class test

system.out.print("\n");

} }}

可以從控制台中觀察到列印的情況,可以發現控制台中列印出來的字串是亂序的,這也就出現了執行緒安全的問題,,執行緒的執行是與當前cpu的資源排程與時間片是有關係的,當乙個執行緒中的執行到某一部分方法的時候輪到另外乙個執行緒來執行相應的**,所以還沒有等到第乙個執行緒執行完那麼cpu有切換到另外乙個執行緒來執行其相應的**,所以這個時候假如操作公共的資料部分就會出現錯誤

為了解決這個問題,可以使用 synchronized 同步**塊來對公共部分進行同步操作,但是需要給它一把鎖,這把鎖是乙個物件,可以是任意乙個物件,但是前提是,兩個執行緒使用的必須是同乙個物件鎖才可以

這樣使用了synchronize關鍵字的**塊,乙個執行緒執行完才輪到另外乙個執行緒執行這樣就解決了執行緒安全的問題

下面是具體的**:

public class main8  catch (interruptedexception e) 

}}).start();

new thread(new runnable() catch (interruptedexception e)

}}).start(); }

static class test

system.out.print("\n");

}} }

}

這個是synchronize關鍵字使用的第一種情況:同步**塊,使得乙個執行緒執行完當前的**才輪到另外乙個執行緒來執行

Java執行緒同步問題synchronized

android usb 讀寫以前都是一讀一寫,但有些機器會出問題。就採用讀寫非同步的方法。使用物件鎖,object自帶的,然後使用object的方法wait和notify notifyall 使用方法簡單,記錄下 public synchronized int lra setregister int...

Java學習之執行緒鎖 synchronized

同步 併發 多個執行緒訪問同乙份資源 確保資源安全 執行緒安全 synchronized 同步 1 同步塊 synchronized 引用型別 this 類.class 2 同步方法 public synchronized void test public class testsyn class t...

Java中equalsIgnoreCase的用法

equalsignorecase public boolean equalsignorecase string anotherstring 將此 string 與另乙個 string 進行比較,不考慮大小寫。如果兩個字串的長度相等,並且兩個字串中的相應字元都相等 忽略大小寫 則認為這兩個字串是相等的...