多執行緒與高併發
當我們對乙個數字進行遞增操作時,如果兩個程式同時訪問,第乙個執行緒讀到count=0,並對其+1,在自己執行緒內部的記憶體裡還沒有寫回去的時候;第二個執行緒讀到的count也是0,並+1寫回去;但是程式明明對count進行了兩次+1操作,但結果還是1。
那麼我們對這個遞增過程加上一把鎖,當第乙個程式訪問的時候,這個資源是它獨佔的,不允許別的執行緒訪問計算,當第乙個執行緒計算完成並釋放鎖之後其它執行緒才能訪問,這樣就保證了執行緒安全。
public
class
thread_006).
start()
;new
thread((
)->).
start()
;}//去掉synchronized 可以看出來不加鎖的情況下我們預期的結果與實際結果是不符合的
static
/*synchronized*/
void
countadd()
catch
(interruptedexception e)
count++;}
system.out.
println
(thread.
currentthread()
.getname()
+"count = "
+ count);}
}當不在countadd方法上加鎖時的執行結果:
thread-
1count =
155thread-
0count =
155當在countadd方法上加鎖的執行結果:
thread-
0count =
100thread-
1count =
200
synchronized 加鎖的方式public
class
thread_007
}//鎖定當前物件
public
voidm2(
)}//等同與m2鎖定當前物件
public
synchronized
voidm3(
)}
靜態方法加鎖public
class
thread_008
public
static
voidm2(
)}}
synchronized保證原子性與執行緒間可見public
class
thread_009
public
static
void
main
(string[
] args)}}
不加sychronized執行結果,我們可以看到多個執行緒輸出了同乙個值,最終結果不是我們預期的0..
....
thread 38223 count =
38230
thread 38166 count =
38229
thread 38226 count =
38229
thread 38169 count =
38229
thread 38284 count =
38230
thread 38168 count =
38228..
....
當我們加上sychronized時,會解決這個問題
thread 4 count =
3thread 5 count =
2thread 2 count =
1thread 1 count =
0
面試題:模擬銀行賬戶,對業務寫方法加鎖,對業務讀方法不加鎖,可以嗎?
答:不可以,容易產生髒讀現象;具體看**,解決方法就是把讀方法也加鎖
public
class
thread_010
catch
(interruptedexception e)
this
.balance = balance;
}public
synchronized
double
getbalance()
public
static
void
main
(string[
] args)
catch
(interruptedexception e)
system.out.
println
("當前賬戶餘額:"
+account.
getbalance()
);trycatch
(interruptedexception e)
system.out.
println
("當前賬戶餘額:"
+account.
getbalance()
);}}
不加鎖執行結果:
當前賬戶餘額:0.0
當前賬戶餘額:300.0
加鎖執行結果:
當前賬戶餘額:300.0
當前賬戶餘額:300.0
synchronized 鎖重入|異常鎖
synchronized 鎖公升級
面試題:cas(自旋鎖)一定比系統鎖的效率高嗎?
答:不一定,分具體情況:執行時間短(加鎖的**),執行緒數少,用自旋;執行時間長,執行緒數多,用系統鎖。
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...
C 執行緒與併發
class program static void go static void gowithparam object msg bool done false private void button6 click object sender,routedeventargs e private voi...