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是如何解决循环依赖的问题
    太麻烦了。。。。。。。。






















  • 相关阅读:
    C# .Net基础知识点解答
    依赖注入框架Autofac的简单使用
    Linq表达式、Lambda表达式你更喜欢哪个?
    C#抽象类、接口、虚函数和抽象函数
    MVC面试问题与答案
    并发 并行 同步 异步 多线程的区别
    .Net中的控制翻转和依赖注入
    解析ASP.NET WebForm和Mvc开发的区别
    测试与代码质量
    netty 同步调用
  • 原文地址:https://www.cnblogs.com/whr-blogs/p/15076189.html
Copyright © 2011-2022 走看看