zoukankan      html  css  js  c++  java
  • spring 中的 bean 是线程安全的吗?

      spring 中的 bean 是线程安全的吗?

      Spring 不保证 bean 的线程安全。

      默认 spring 容器中的 bean 是单例的。当单例中存在竞态条件,即有线程安全问题。如下面的例子

      计数类

      package constxiong.interview.threadsafe;

      /**

      * 计数类

      * @author ConstXiong

      * @date 2019-07-16 14:35:40

      */

      public class Counter {

      private int count = 0;

      public void addAndPrint() {

      try {

      Thread.sleep(10);

      } catch (InterruptedException e) {

      e.printStackTrace();

      }

      System.out.println(++count);

      }

      }

      spring 配置文件

      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

      xmlns:context="http://www.springframework.org/schema/context"

      xsi:schemaLocation="

      http://www.springframework.org/schema/beans

      http://www.springframework.org/schema/beans/spring-beans.xsd

      http://www.springframework.org/schema/context

      http://www.springframework.org/schema/context/spring-context.xsd">

      测试类

      package constxiong.interview.threadsafe;

      import org.springframework.context.ApplicationContext;

      import org.springframework.context.support.ClassPathXmlApplicationContext;

      public class CounterTest {

      public static void main(String[] args) {

      final ApplicationContext context = new ClassPathXmlApplicationContext("spring_safe.xml");

      for (int i = 0; i < 10; i++) {

      new Thread(){

      @Override

      public void run() {

      Counter counter = (Counter)context.getBean("counter");

      for (int j = 0; j < 1000; j++) {

      counter.addAndPrint();

      }

      }

      }.start();

      }

      }

      }

      打印结果开头和结尾

      1无锡人流费用 http://www.xasgfk120.com/

      5

      7

      4

      2

      6

      3

      8

      9

      .

      .

      .

      9818

      9819

      9820

      9821

      9822

      9823

      9824

      9825

      期望打印出的最大值应该是 10000

      修改 spring 配置文件,把 bean 的作用域改为 prototype

      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

      xmlns:context="http://www.springframework.org/schema/context"

      xsi:schemaLocation="

      http://www.springframework.org/schema/beans

      http://www.springframework.org/schema/beans/spring-beans.xsd

      http://www.springframework.org/schema/context

      http://www.springframework.org/schema/context/spring-context.xsd">

      测试结果输出10个 1000

      即每个线程都创建了一个 Counter 对象,线程内独自计数,不存在线程安全问题。但是不是我们想要的结果,打印出 10000。

      所以 spring 管理的 bean 的线程安全跟 bean 的创建作用域和 bean 所在的使用环境是否存在竞态条件有关,spring 并不能保证 bean 的线程安全。

  • 相关阅读:
    PHP全路径无限分类原理
    SecureCRT上传bash: rz: command not found
    Android利用Fiddler进行网络数据抓包【怎么跟踪微信请求】
    Creating the Help Page in ASP.NET Web API
    Windows上怎么安装ELK
    安装ELK
    How to kill a process on a port on linux 怎么杀死 关掉一个端口
    How to install Mysql in the CentOS
    Hadoop: Setup Maven project for MapReduce in 5mn
    Install Ambari 2.2.0 from Public Repositories(Hadoop)
  • 原文地址:https://www.cnblogs.com/djw12333/p/11388391.html
Copyright © 2011-2022 走看看