更新時(shí)間:2023-04-20 來(lái)源:黑馬程序員 瀏覽量:
Spring bean并沒(méi)有可變的狀態(tài)(比如Service類(lèi)和DAO類(lèi)),所以在某種程度上說(shuō)Spring的單例bean是線(xiàn)程安全的。
不是線(xiàn)程安全的Spring框架中有一個(gè)@Scope注解,默認(rèn)的值就是singleton,單例的。因?yàn)橐话阍趕pring的bean的中都是注入無(wú)狀態(tài)的對(duì)象,沒(méi)有線(xiàn)程安全問(wèn)題,如果在bean中定義了可修改的成員變量,是要考慮線(xiàn)程安全問(wèn)題的,可以使用多例或者加鎖來(lái)解決。
當(dāng)多用戶(hù)同時(shí)請(qǐng)求一個(gè)服務(wù)時(shí),容器會(huì)給每一個(gè)請(qǐng)求分配一個(gè)線(xiàn)程,這是多個(gè)線(xiàn)程會(huì)并發(fā)執(zhí)行該請(qǐng)求對(duì)應(yīng)的業(yè)務(wù)邏輯(成員方法),如果該處理邏輯中有對(duì)該單列狀態(tài)的修改(體現(xiàn)為該單例的成員屬性),則必須考慮線(xiàn)程同步問(wèn)題。
Spring框架并沒(méi)有對(duì)單例bean進(jìn)行任何多線(xiàn)程的封裝處理。關(guān)于單例bean的線(xiàn)程安全和并發(fā)問(wèn)題需要開(kāi)發(fā)者自去搞定。
比如:我們通常在項(xiàng)目中使用的Springbean都是不可可變的狀態(tài)(比如Service類(lèi)和DAO類(lèi)),所以在某種程度上說(shuō)Spring的單例bean是線(xiàn)程安全的。
如果你的bean有多種狀態(tài)的話(huà)(比如ViewModel對(duì)象),就需要自行保證線(xiàn)程安全。最淺顯的解決辦法就是將多態(tài)bean的作用由"singleton"變更為"prototype"。