spring的bean是线程安全的吗,以及一些简单的ThreadLocal知识

一。首先spring中的bean是线程不安全的

     spring的作用域大致可以分为两种,一种是单例模式,一种是原型模式

  在单例模式中bean只会被ioc容器初始化一次(当然讲到单例模式自然既有饱和饿汉的方法),但不管咋样就是线程不安全的,因为ioc容器只初始化一次

将数据就加载到JVM内存当中,但是我们知道在多线程的情况下,用户是会公用一个bean的应为是单例模式的,这样就会产生线程不安全的问题,线程不安全

的最基本含义就是信息不共享,也即是说的数据不同步,这里就是我们的锁就可以出来了,他就是来保证线程安全的,在线程获取并操作数据的时候就会将

属等栈中存储的数据会加载到在即本地线程栈当中也就是ThreadLocal,

其中要明白ThreadLocal里面维护的是什么-----一个map 这就是线程安全了呀,

AtomicInteger 这个关键字就安全的。
 /**
     * The next hash code to be given out. Updated atomically. Starts at
     * zero.
     */
    private static AtomicInteger nextHashCode =
        new AtomicInteger();

    /**
     * The difference between successively generated hash codes - turns
     * implicit sequential thread-local IDs into near-optimally spread
     * multiplicative hash values for power-of-two-sized tables.
     */
    private static final int HASH_INCREMENT = 0x61c88647;

    /**
     * Returns the next hash code.
     */
    private static int nextHashCode() {
        //自增
        return nextHashCode.getAndAdd(HASH_INCREMENT);
    }
AtomicInteger  笔记记到这里就设计到锁相关的知识了:
锁其实是一件特别好理解的事情,就是一个人操作数据,期间不允许其他人对数据进行操作,这里的人就是指线程,人操作的东西就是数据,而对应数据的操作不过就是读和写,所以这里就产生了
读读,读写,写写。写读之间的间隔也就是枷锁,其实线程间的锁可以类比的数据库当中也就是mysql中的读写锁啥的,一个道理。其实锁的本质就是一个阻拦的作用。

下来说spring是如何解决循环依赖的问题
太麻烦了。。。。。。。。






















posted @ 2021-07-29 17:28  maskpd  阅读(1056)  评论(0编辑  收藏  举报