有状态对象,无状态对象,线程安全等的一些理解

最近把一些常常挂在嘴边,但没法彻底理清楚的概念重新复习了下,做了一些方便理解的图片。

概念一 无状态对象和有状态对象

概念的定义:1、有状态就是有数据存储功能。有状态对象(Stateful Bean),就是有实例变量的对象,可以保存数据,是非线程安全的。在不同方法调用间不保留任何状态。

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

概念二 单例对象

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

概念三 线程安全

线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。

以下图文为梳理的一些概念


我们现在制造一个传送带(实例化对象),这个传送带每次只能运输一件包裹(一份数据),这上面运的是包裹是纸箱还是文件袋,最终结果是上游往传送带上摆放的包裹来决定的,和传送带本身无关,那这种传送带就是无状态的对象,是线程安全的。

 

如果在刚刚造的传送带增加个一个的仪器(局部变量),这个仪器可以根据传送带上的包裹的地址,生成一个数字,类似01、02、03、04之类的,然后把数字打印到箱子的表面(根据入参,调用方法,修改局部变量),那么在只有一个传送带(单例)的情况下会有以下几个场景

1、上游只有一个工人放包裹(单线程),每次只往上面放一个箱子(参数固定),所以最终到下游的袋子(数据库)的包裹上的数字不会出错。


2、上游有多个工人放东西(多线程),大家轮流排队使用传送带,等上一个人用完之后,下一个人才能接着用(synchronized锁),保证里面的东西也不会混在一起。我们在传送下在增加一个分拣人员(工厂方法),根据传送带上的包裹数字(entity),分到不同袋子里面。


3、上游有多个厂,大家不排队,只管往上面丢,由于这个仪器可能把第一个包裹上的地址识别出来后,把数字打印到第二包裹上了,下游的工厂还是根据包裹上的数字继续分,但是包裹上的数字已经搞混了。导致袋子里面的包裹也是乱的。

/** 
 * 有状态bean,有state,user等属性,并且user有存偖功能,是可变的。 
 *    
 */ 
public class StatefulBean {  
   
    public int state;  
    // user是MVC中的M,实体类,有数据库表的属性和属性的setter、getter方法
    // 由于多线程环境下,user是引用对象,是非线程安全的  
    public User user;  
   
    public int getState() {  
        return state;  
    }  
   
    public void setState(int state) {  
        this.state = state;  
    }  
   
    public User getUser() {  
        return user;  
    }  
   
    public void setUser(User user) {  
        this.user = user;  
    }  
}  
   
/** 
 * 无状态bean,不能存偖数据。因为没有任何属性,所以是不可变的。只有一系统的方法操作。 
 *  
 *  
 */ 
public class StatelessBeanService {  
    //billDao是dao层类,有一些find,add,save方法。dao本身也是单例的,属于无状态;不存在线程安全    
    //问题。
    //虽然有billDao属性,但billDao是没有状态信息的,是Stateless Bean.  
    BillDao billDao;  
   
    public BillDao getBillDao() {  
        return billDao;  
    }  
   
    public void setBillDao(BillDao billDao) {  
        this.billDao = billDao;  
    }  
   
    public List<User> findUser(String Id) {  
         return null;  
    }  
}  

引用至:https://www.cnblogs.com/xubiao/p/6567349.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值