synchronized同步方法是為了解決「非執行緒安全」的問題,所謂「非執行緒安全」是指多個執行緒對同乙個物件中的變數進行併發訪問時發生,產生「髒讀」的情況。
「非執行緒安全」問題存在於「例項變數」中,如果是方法內部的私有變數,則不存在「非執行緒安全」問題,也就是「執行緒安全」的了。
demo:
hasselfprivatenum類:
public
class hasselfprivatenum else
system.out.println(username+" num="+num);
}catch (interruptedexception e)
}}
a執行緒類
public
class
threada
extends
thread
@override
public
void
run()
}
b執行緒類:
public
class
threadb
extends
thread
@override
public
void
run()
}
main方法:
public
class run
}
執行結果:
a
set over!
b set over!
b num=200
anum=100
從結果可以看出這是執行緒安全的且永久安全,這是方法內部的變數私有的特性的原因(num變數是屬於方法內部的)。
如果多個執行緒共同訪問1個物件中的例項變數,則有可能出現「非執行緒安全」的問題;
用執行緒訪問的物件中如果有多個例項變數,則執行的結果有可能出現交叉的情況;
如果物件僅有1個例項變數,則有可能出現覆蓋的情況。
修改hasselfprivatenum類,如下:
public
class hasselfprivatenum else
system.out.println(username+" num="+num);
}catch (interruptedexception e)
}}
執行main方法,結果如下:
a
set over!
b set over!
b num=200
anum=200
本例項中兩個執行緒同時操作業務物件中的例項變數,產生了覆蓋的情況,出現了「執行緒不安全」的問題。
解決方法:
在public void addi(string username)方法錢加關鍵字synchronized即可,如下:
public
class hasselfprivatenum else
system.out.println(username+" num="+num);
}catch (interruptedexception e)
}}
執行main方法,結果如下:
a
set over!
anum=100
b set over!
b num=200
當多個執行緒訪問同乙個物件中的同步方法時一定是執行緒安全的。
因為是同步訪問,所以先列印a,然後列印出b。
java多執行緒
在網上看到很有意思的問題,摘下來好好看下 在面試的時候被問了乙個多執行緒的問題 回來仔細思考了一下,多執行緒是否真的能提高了效率?我對多執行緒的理解就是 比如挖乙個隧道,有2種開工方法 1 只在山的一頭挖,直至挖到山的另一頭,從而打通隧道,這可以看成是單執行緒 2 在山的兩頭挖,同時開工,最後在山的...
Java 多執行緒
1。thread類和runnable介面 2。主線程 用thread的static thread currentthread 方法獲得 3。通過實現runnable介面建立執行緒 實現runnable介面的run方法。新執行緒在run 方法返回時結束。注意用這種方法建立程序時,在實現runnable...
JAVA 多執行緒
為hashmap的不正確使用所導致。hashmap在多執行緒環境下使用不安全。使用靜態hashmap作為聯絡人資料快取,key為手機號碼.private static maplxrdata new hashmap 多執行緒環境下不同步hashmap可能導致如下問題 1 多執行緒put操作後可能導致g...