日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转】多线程之有状态对象和无状态对象

發(fā)布時間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】多线程之有状态对象和无状态对象 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

有狀態(tài)對象和無狀態(tài)對象

參考:https://www.cnblogs.com/xubiao/p/6567349.html

一. 基本概念

1. 什么是有狀態(tài)對象

有狀態(tài)對象指的是有數(shù)據(jù)存儲功能的類的對象。(就是類含有字段或屬性,他的對象含有實例變量,可以保存數(shù)據(jù))
有狀態(tài)對象(Stateful Bean),就是有實例變量的對象,可以保存數(shù)據(jù),是非線程安全的。

2. 什么是無狀態(tài)對象

無狀態(tài)對象就是一次操作的對象,不能保存數(shù)據(jù)的對象。
無狀態(tài)對象(Stateless Bean),指的就是沒有實例變量的對象,不能保存數(shù)據(jù),是不可變類,是線程安全的對象。

二. 代碼實現(xiàn)有狀態(tài)對象和無狀態(tài)對象

1. 有狀態(tài)對象的實現(xiàn)

  • Test類
package com.xiyou.activemq.po;import lombok.Data;/*** 這是一個實體類,該類是一個有狀態(tài)對象,因為該類有實例變量*/@Data public class Test {private Integer id;private String address; }
  • StatefulBeanService類
package com.xiyou.activemq.service;import com.xiyou.activemq.po.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;/*** 該類是一個有狀態(tài)對象,因為里面有實例變量Test(并且Test并不是一個無狀態(tài)對象)*/ @Service public class StatefulBeanService {@Autowiredprivate Test test;public void test(){System.out.println("這是一個有狀態(tài)對象,因為該類有實例變量Test(Test類是一個有狀態(tài)的對象)");}}

2. 無狀態(tài)對象的實現(xiàn)

  • TestDao類
package com.xiyou.activemq.dao;import org.springframework.stereotype.Component;@Component public class TestDao {public void test(){System.out.println("這里沒有有狀態(tài)對象,該類的對象就是一個無狀態(tài)對象");} }
  • StatelessBeanService類
@Service public class StatelessBeanService {// 雖然testDao是一個實例對象,但是該實例對象卻是一個無狀態(tài)對象,因此這個類也是一個無狀態(tài)對象@Autowiredprivate TestDao testDao;public void testStatelessBean(){System.out.println("這是一個無狀態(tài)對象,雖然這里有實例對象,但是該對象是一個無狀態(tài)對象,因此這里也是一個無狀態(tài)對象");} }

三. Spring中的有狀態(tài)和無狀態(tài)

  • 通過上面的分析,我們大概知道了什么是有狀態(tài)對象,什么是無狀態(tài)對象。無狀態(tài)的Bean適用于不變模式,技術就是單例模式,這樣單例模式j間的實例共享,能夠提高性能。有狀態(tài)的bean,多環(huán)境下不安全,適用于property原型模式。Property在每次對bean的請求都會創(chuàng)建一個bean的實例
  • 默認情況下,Spring Bean的工廠取得的所有實例是singleton,容器只存在一個共享的bean
  • scope的選擇 (重要
    (1)有狀態(tài)的bean都使用property作用域
    (2)無狀態(tài)的bean則使用singleton的作用域
  • 如Service層和Dao層,直接用Singletob即可。雖然Service的類也有Dao這類的屬性,但是Dao這些類都是沒有狀態(tài)信息的,也就是不變類,所以不影響。
  • 四. Servlet是單例模式

    Servlet體系結構是建立在Java多線程機制上的,他的生命周期是由Web容器負責的,一個Servlet類在Application中只有一個實例存在,也就是說有多個線程都在使用這個實例。這是單例模式的應用。無狀態(tài)的單例模式是線程安全的,但是如果我們在Servlet中使用了實例變量,那么就變成了有狀態(tài)的,就變成了singleton+有狀態(tài),這個就是非線程安全的。

    總結一下:

  • 無狀態(tài)的單例模式是線程安全的
  • 有狀態(tài)的單例模式是線程不安全的
  • 單例搭配無狀態(tài)對象(singleton+無狀態(tài)對象)
  • 多例搭配有狀態(tài)對象(property+有狀態(tài)對象)
  • 總結

    以上是生活随笔為你收集整理的【转】多线程之有状态对象和无状态对象的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。