zoukankan      html  css  js  c++  java
  • 谈谈你对线程安全的理解?

    如果这个是面试官直接问你的问题,你会怎么回答?

    一个专业的描述是,当多个线程访问一个对象时,如果不用进行额外的同步控制或其他的协调操作,调用这个对象的行为都可以获得正确的结果,我们就说这个对象是线程安全的

    那么我们如何做到线程安全?

    实现线程安全的方式有多种,其中在源码中常见的方式是,采用synchronized关键字给代码块或方法加锁,比如StringBuffer
    查看StringBuffer的源码,你会看到是这样的:

    那么,我们开发中,如果需要拼接字符串,使用StringBuilder还是StringBuffer?

    场景一:

    如果是多个线程访问同一个资源,那么就需要上锁,才能保证数据的安全性。

    这个时候如果使用的是非线程安全的对象,比如StringBuilder,那么就需要借助外力,给他加synchronized关键字。或者直接使用线程安全的对象StringBuffer

     

    场景二:

    如果每个线程访问的是各自的资源,那么就不需要考虑线程安全的问题,所以这个时候,我们可以放心使用非线程安全的对象,比如StringBuilder

     

    比如在方法中,创建对象,来实现字符串的拼接。

    看场景,如果我们是在方法中使用,那么建议在方法中创建StringBuilder,这时候相当是每个线程独立占有一个StringBuilder对象,不存在多线程共享一个资源的情况,所以我们可以安心使用,虽然StringBuilder本身不是线程安全的。

     

    什么时候需要考虑线程安全?

    1,多个线程访问同一个资源

    2,资源是有状态的,比如我们上述讲的字符串拼接,这个时候数据是会有变化的

  • 相关阅读:
    Python动态展示遗传算法求解TSP旅行商问题
    MOEAD算法中均匀权向量的实现---Python
    HDU 5294 多校第一场1007题 最短路+最小割
    POJ 3261 Milk Patterns sa+二分
    HDU 4292 FOOD 2012 ACM/ICPC Asia Regional Chengdu Online
    CodeForces 201A Clear Symmetry
    POJ 1679 The Unique MST 确定MST是否唯一
    POJ 3268 Silver Cow Party 最短路 基础题
    POJ 2139 SIx Degrees of Cowvin Bacon 最短路 水題
    POJ2229 Sumsets 基礎DP
  • 原文地址:https://www.cnblogs.com/MJyc/p/13948500.html
Copyright © 2011-2022 走看看