zoukankan      html  css  js  c++  java
  • 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是如何解决循环依赖的问题
    太麻烦了。。。。。。。。






















  • 相关阅读:
    ARP 协议
    天梯赛L1 题解
    DNS域名系统
    LeetCode 三角形最小路径和
    sql注入漏洞的利用
    XSS漏洞防御
    忘记密码功能漏洞挖掘
    sql bypass
    Web环境搭建组合
    常用数据库的总结
  • 原文地址:https://www.cnblogs.com/whr-blogs/p/15076189.html
Copyright © 2011-2022 走看看