執行緒安全性——從StringBuffer和StringBuilder的區別說起
阿新 • • 發佈:2019-02-12
面試的時候面試官問到了執行緒安全的問題,感覺答得不如人意。當時沒答好,問面試官如何理解好,他說:可以參照StringBuffer和StringBuilder。於是趕緊回來自行惡補一下。這就是學渣的苦果呀/(ㄒoㄒ)/~~
執行緒安全性概念
執行緒安全:就是多執行緒訪問時,採用了加鎖機制,當一個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用。不會出現資料不一致或者資料汙染。
相反地,
執行緒不安全:就是不提供資料訪問保護,有可能出現多個執行緒先後更改資料造成所得的資料是髒資料。
StringBuffer和StringBuilder的區別
從字串的拼接和讀取來看,StringBuilder的速度比StringBuffer要快。這是因為Stringbuffer中方法大都採用了synchronized的關鍵字修飾。也就是說,StringBuffer中所有的方法都要加鎖,所以好多操作看上去都是線性操作的。所以要慢些。就好像集合HashTable和HashMap一樣,HashTable是執行緒安全的,很多方法都是synchronized方法,而HashMap不是執行緒安全的,但其在單執行緒程式中的效能比HashTable要高。StringBuffer和StringBuilder類的區別也是如此,他們的原理和操作基本相同,區別在於StringBufferd支援併發操作,線性安全的,適 合多執行緒中使用。StringBuilder不支援併發操作,線性不安全的,不適合多執行緒中使用。新引入的StringBuilder類不是執行緒安全的,但其在單執行緒中的效能比StringBuffer高。