共享變數類
package com.chapter02.thread1;
public
class
hasselfprivatenum
else
system.out.
println
(username +
" num = "
+ num);}
catch
(interruptedexception e)
}}
自定義執行緒apackage com.chapter02.thread1;
public
class
threada
extends
thread
@override
public
void
run(
)}
自定義執行緒bpackage com.chapter02.thread1;
public
class
threadb
extends
thread
@override
public
void
run(
)}
啟動類package com.chapter02.thread1;
public
class
run}
執行結果a set over!
b set over!
b num = 200
a num = 100
結論
方法中的變數不存在非執行緒安全問題,永遠都是執行緒安全的。
共享變數類
package com.chapter02.thread1;
public
class
hasselfprivatenum
else
system.out.
println
(username +
" num = "
+ num);}
catch
(interruptedexception e)
}}
自定義執行緒apackage com.chapter02.thread1;
public
class
threada
extends
thread
@override
public
void
run(
)}
自定義執行緒bpackage com.chapter02.thread1;
public
class
threadb
extends
thread
@override
public
void
run(
)}
啟動類package com.chapter02.thread1;
public
class
run}
執行結果//如果不新增synchronized
a set over!
b set over!
b num = 200
a num = 200
//如果新增synchronized
a set over!
a num = 100
b set over!
b num = 200
結論
在兩個執行緒訪問同乙個物件中的同步方法時一定是執行緒安全的。
修改實驗2**,修改啟動類
package com.chapter02.thread1;
public
class
run}
輸出結果a set over!
b set over!
b num = 200
a num = 100
結論
上面的示例 建立了2個hasselfprivatenum類的物件,所以產生了2個鎖。
執行緒同步synchronized
synchronized只是保證在同乙個時刻,其他執行緒不能訪問鎖定的資源,但是其他方法或者是變數不能鎖定控制的 synchronized obj 上面語法格式中synchronized後括號裡的obj就是同步監視器,上面 的含義是 執行緒開始執行同步 塊之前,必須先獲得對同步監視器的鎖定。任何時刻...
synchronized同步方法
關鍵字synchronized 如果是在方法內的變數,則無所謂的的變數同步問題。因為在方法內部的變數都是私有的。synchronized如果是加在方法上面,則是對該物件的例項進行同步。如果有兩個執行緒同時對該方法進行操作,則會同步進行。對個例項多個執行緒,不存在同步的問題,那時jvm會生成多個鎖,應...
Synchronized同步方法
非執行緒安全 其實會在多個執行緒對同乙個物件中的例項變數進行併發訪問時發生,產生的後果就是 髒讀 也就是取到的資料其實是被更改過的。1 方法內的變數為執行緒安全的 方法內部的私有變數,則不存在 非執行緒安全 的問題,所得結果也就是 執行緒安全 的。2 例項變數非執行緒安全 如果多個執行緒共同訪問乙個...