开发者社区> 问答> 正文

线程不安全会发生什么问题?

如题,线程不安全会发生什么问题?

展开
收起
蛮大人123 2016-03-26 10:42:53 2479 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    多线程带来的风险有三种,安全性问题,活跃性问题,性能问题。
    首先,安全性问题,《Java并发编程》一书中对类的线程安全的定义是:当多个线程访问某个类时,不管运行环境采用何种调度方式或者这些线程将如何交替执行,并且在主调用代码中不需要任何额外的同步或者协同,这个类都能表现正确的行为,那么这个类就是线程安全的。
    相反这段描述的另一面就是线程不安全的,即可能出现某个类的行为与其规范的不一致。例如:数值序列生成器,简单的共享变量++操作。

     public class UnsafeSequence{
         private int value;
             public int getNext(){
                 return value++;
            }
     }

    这段代码的getNext如果执行时机不对,那么两个线程在调用getNext时会得到相同的值,因为value++操作本身包含三种独立的操作,读value,value+1,写入value,这三个动作如果在多个线程之间交替执行,就可能导致最终的数据不合常理。也就是说这段代码存在安全性问题。
    其次,活跃性问题是指当某个操作无法继续执行下去时就会发生活跃性问题,如锁机制下线程死锁的问题。
    最后,性能问题,多线程程序中,线程的调度,频繁的上下文切换等操作会带来极大的开销,也是编写多线程应用需要权衡的问题。

    2019-07-17 19:15:40
    赞同 展开评论 打赏
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
多IO线程优化版 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载