多线程之有状态对象和无状态对象

有状态对象和无状态对象

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

一. 基本概念

1. 什么是有状态对象

有状态对象指的是有数据存储功能的类的对象。
有状态对象(Stateful Bean),就是有实例变量的对象,可以保存数据,是非线程安全的,在不同的方法调用期间不会保留任何的状态。

2. 什么是无状态对象

无状态对象就是一次操作的对象,不能保存数据的对象。
无状态对象(Stateless Bean),指的就是没有实例变量的对象,不能保存数据,是不可变类,是线程安全的对象。

二. 代码实现有状态对象和无状态对象

1. 有状态对象的实现
  • Test类
package com.xiyou.activemq.po;

import lombok.Data;

/**
 * 这是一个实体类,该类是一个有状态对象,因为该类有实例变量
 */

@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;

/**
 * 该类是一个有状态对象,因为里面有实例变量Test(并且Test并不是一个无状态对象)
 */
@Service
public class StatefulBeanService {

    @Autowired
    private Test test;

    public void test(){
        System.out.println("这是一个有状态对象,因为该类有实例变量Test(Test类是一个有状态的对象)");
    }

}

2. 无状态对象的实现
  • TestDao类
package com.xiyou.activemq.dao;

import org.springframework.stereotype.Component;

@Component
public class TestDao {
    public void test(){
        System.out.println("这里没有有状态对象,该类的对象就是一个无状态对象");
    }
}
  • StatelessBeanService类
@Service
public class StatelessBeanService {

    // 虽然testDao是一个实例对象,但是该实例对象却是一个无状态对象,因此这个类也是一个无状态对象
    @Autowired
    private TestDao testDao;

    public void testStatelessBean(){
        System.out.println("这是一个无状态对象,虽然这里有实例对象,但是该对象是一个无状态对象,因此这里也是一个无状态对象");
    }
}

三. Spring中的有状态和无状态

  1. 通过上面的分析,我们大概知道了什么是有状态对象,什么是无状态对象。无状态的Bean适用于不变模式,技术就是单利模式,这样单利模式件的共享实例,提高性能。有状态的bean,多环境下不安全,适用于property原型模式。Property在每次对bean的请求都会创建一个bean的实例
  2. 默认情况下,Spring Bean的工厂所有取得实例是singleton,容器只存在一个共享的bean
  3. scope的选择 (重要
    (1)有状态的bean都使用property作用域
    (2)无状态的bean则使用singleton的作用域
  4. 如Service层和Dao层,直接用Singletob即可。虽然Service的类也有Dao这类的属性,但是Dao这些类都是没有状态信息的,也就是不变类,所以不影响。

四. Servlet是单例模式

Servlet体系结构是建立在Java多线程机制上的,他的生命周期是由Web容器负责的,一个Servlet类在Application中只有一个实例存在,也就是说有多个线程都在使用这个实例。这是单例模式的应用。无状态的单例模式是线程安全的,但是如果我们在Servlet中使用了实例变量,那么就变成了有状态的,就变成了singleton+有状态,这个就是非线程安全的。

总结一下:

  1. 无状态的单利模式是线程安全的
  2. 有状态的单例模式是线程不安全的
  3. 单利搭配无状态对象(singleton+无状态对象)
  4. 多利搭配有状态对象(property+有状态对象)
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值