请选择 进入手机版 | 继续访问电脑版

springIOC容器管理的bean默认都是单例的

[复制链接]
奇奇女 发表于 2020-12-31 19:20:49 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
 
springIOC容器管理的bean默认都是单例的
我们平时使用的 @controller注解标注的控制器、@Service标注的接口等  默认都是单例的
那么也就是说,我们界说一个成员变量,线程之间可以共用!
滑稽!!!干了几年了我竟然不知道。先模拟个锁玩一下
 
  1. /** * 测试spring 管理的bean 的作用域 锁模拟 */@RestController@RequestMapping("/lock/")public class SpringActionScopelockController {    private boolean lock = false;    @RequestMapping("open1")    public String open1() {        while (lock) {        }        System.out.println("open1抢到锁了");        lock = true;        try {            Thread.sleep(5000);        } catch (InterruptedException e) {            e.printStackTrace();        }        lock =false;        System.out.println("open1释放锁了");        return "ok";    }    @RequestMapping("open2")    public String open2() {        while (lock) {        }        System.out.println("open2抢到锁了");        lock = true;        try {            Thread.sleep(5000);        } catch (InterruptedException e) {            e.printStackTrace();        }        lock =false;        System.out.println("open2释放锁了");        return "ok";    }}
复制代码
同时访问 open1和open2
控制台打印如下
  1. open2抢到锁了open2释放锁了open1抢到锁了open1释放锁了
复制代码
一个模拟的当地同步锁就诞生了,虽然照旧不很严谨,大概会出现并发安全问题。
下面先容下 spring bean作用域有以下5个:
  1. singleton:单例模式,当spring创建applicationContext容器的时候,spring会欲初始化所有的该作用域实例,加上lazy-init就可以制止预处置惩罚;prototype:原型模式,每次通过getBean获取该bean就会新产生一个实例,创建后spring将不再对其管理;====下面是在web项目下才用到的===request:搞web的大家都应该明白request的域了吧,就是每次请求都新产生一个实例,和prototype差别就是创建后,接下来的管理,spring依然在监听session:每次会话,同上global session:全局的web域,雷同于servlet中的application
复制代码
使用方法 增加注解 @Scope("prototype")来指定差别的作用模式
末端~~~~~抱着死磕到底的态度,下期准备优化锁,自己实现一个线程安全的锁!初步看了一下,还挺难的,暂无好的思路。如果大家有这方面的思路,欢迎留言辅导!!!感谢大家

来源:https://blog.csdn.net/qq_38965140/article/details/111999561
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )