zoukankan      html  css  js  c++  java
  • Java 并发系列之十一:并发线程带来的风险

    1. 概述

    在并发中有两种方式,一是多进程,二是多线程,但是线程相比进程花销更小且能共享资源。

    线程带来的风险:

    1. 安全性问题。错误的问题永不发生。竞态条件(顺序敏感)。

    2. 活跃性问题。正确的事情一定会发生。死循环,死锁。

    3. 性能问题。正确的事情尽快发生。服务时间过长,响应不灵敏,吞吐率过低

    2. 安全性问题

      定义:安全性问题的含义是“永远不发生糟糕的事情”

      原因:内存共享,指令重排序,并行运行,操作顺序不可预测,将会在串行编程模型中引入非串行因素,产生奇怪的结果。便利的同时有风险,很难分析。

      常见:有一种常见的并发安全问题叫“竞态条件”。 

    /**
    1、什么是竞态条件?
    
        当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。
    
        导致竞态条件发生的代码区称作临界区。
    
        在临界区中使用适当的同步就可以避免竞态条件。
    
        临界区实现方法有两种,一种是用synchronized,一种是用Lock显式锁实现。
    */

    3. 活跃性问题

        线程会导致一些在单线程程序中不会出现的问题,那就是活跃性问题。

        活跃性则关注另外一个目标:“某件正确的事情最终会发生”。当某个操作无法继续执行下去时,就会发生活跃性问题。

        在串行程序中,活跃性问题的一种就是无意中造成的无限循环,使得不能按照设计的工作进行,执行不到后面的代码。或者由于资源竞争而导致的死锁等。

    4. 性能问题

        活跃性意味着某件正确的事情会中会发生,但却不够好,因为我们希望正确的事情尽快发生

        性能问题包括多个方面,例如服务时间过长,响应不灵敏,吞吐率过低等等。

        所以多线程需要良好的设计来提升线程的性能,但无论如何线程总会带来额外的开销,由于多线程之间的调度会频繁地出现上下文切换操作,保存和恢复执行上下文,线程之间共享数据时需要同步等等。

  • 相关阅读:
    Python 序列化处理
    httpclient
    java获取配置文件中变量值
    利用数据库管理工具(Navicat)导出数据到Excel表中
    如何确保发布的项目是最新的
    上传文件,重命名
    Mybatis plus中一个框多条件查询 SQL拼接
    用eclipse发布springboot项目
    使用SQL命令行更改数据库字段类型
    Java中查询某个日期下所有时间段的数据
  • 原文地址:https://www.cnblogs.com/haimishasha/p/11591799.html
Copyright © 2011-2022 走看看