首页 > 其他分享 >安全性、活跃性以及性能问题

安全性、活跃性以及性能问题

时间:2023-03-18 15:45:05浏览次数:42  
标签:count 无锁 get 性能 并发 活跃性 线程 执行 安全性

安全性

并发bug三大源头

源头

  • 原子性问题
  • 可见性问题
  • 有序性问题

bug风险点

存在共享数据并且该数据会发生变化(即多个线程会同时读写同一数据)

分类

  1. 数据竞争
    当多个线程同时访问同一数据,并且至少有一个线程会写这个数据。

    假设 count=0,当两个线程同时执行 get() 方法时,get() 方法会返回相同的值 0,两个线程执行 get()+1 操作,结果都是 1,之后两个线程再将结果 1 写入了内存。你本来期望的是 2,而结果却是 1。
    
  2. 竞态条件
    程序的执行结果依赖线程执行的顺序。

    public class Test {
        private long count = 0;
        synchronized long get(){
            return count;
        }
        synchronized void set(long v){
            count = v;
        }
        void add10K() {
            int idx = 0;
            while(idx++ < 10000) {
                set(get()+1);
            }
        }
    }
    

    假设 count=0,如果两个线程完全同时执行,那么结果是 1;如果两个线程是前后执行,那么结果就是 2。

    在并发环境里,线程的执行顺序是不确定的,如果程序存在竞态条件问题,那就意味着程序执行的结果是不确定的,而执行结果不确定这可是个大 Bug。

活跃性

指某个操作无法执行下去。

死锁

线程会互相等待,而且会一直等待下去。

活锁

线程间资源冲突激烈,引起线程不断的尝试获取资源,不断的失败。活锁有可能自己解开。

解决方案:等待一个随机时间。

饥饿

线程因无法访问所需资源而无法执行下去的情况。

在 CPU 繁忙的情况下,优先级低的线程得到执行的机会很小,就可能发生线程“饥饿”;持有锁的线程,如果执行的时间过长,也可能导致“饥饿”问题。

3种解决方案:

  1. 保证资源充足
  2. 公平分配资源
  3. 避免持有锁的线程长时间执行

方案1和3的适用场景有限,一般2多点,如公平锁。

公平锁:先来后到的方案,线程的等待是有顺序的,排在等待队列前面的线程会优先获得资源

性能问题

“锁”的过度使用可能导致串行化的范围过大,降低性能。

阿姆达尔(Amdahl)定律:处理器并行运算之后效率提升的能力
image

n 可以理解为 CPU 的核数,p 可以理解为并行百分比,那(1-p)就是串行百分比。
假设 CPU 的核数(也就是 n)无穷大,那加速比 S 的极限就是 20。

性能解决方案

  1. 使用无锁的算法和数据结构
    如线程本地存储 (Thread Local Storage, TLS)、写入时复制 (Copy-on-write)、乐观锁等;Java 并发包里面的原子类也是一种无锁的数据结构;Disruptor 则是一个无锁的内存队列

  2. 减少锁持有的时间
    互斥锁本质上是将并行的程序串行化,所以要增加并行度,一定要减少持有锁的时间。

    如使用细粒度的锁,一个典型的例子就是 Java 并发包里的 ConcurrentHashMap,它使用了所谓分段锁的技术;还可以使用读写锁,也就是读是无锁的,只有写的时候才会互斥。

性能指标

  1. 吞吐量:指的是单位时间内能处理的请求数量。吞吐量越高,说明性能越好。

  2. 延迟:指的是从发出请求到收到响应的时间。延迟越小,说明性能越好。

  3. 并发量:指的是能同时处理的请求数量,一般来说随着并发量的增加、延迟也会增加。所以延迟这个指标,一般都会是基于并发量来说的。例如并发量是 1000 的时候,延迟是 50 毫秒。

标签:count,无锁,get,性能,并发,活跃性,线程,执行,安全性
From: https://www.cnblogs.com/kiper/p/17230892.html

相关文章

  • 前端性能优化小记
    背景功能测试后的首页响应较慢,大概要3-6s的样子,于是需要优化。目标首次加载3S渲染完毕二次加载1s渲染完毕当前情况(PC)谷歌渲染如下 分析(PC)请求数太多,共33......
  • 新手如何入门性能测试?一文4个章节带你学会性能测试
    本文介绍一下性能测试的基础内容和一些学习经验,主要讲针对服务器端的性能测试。其他代码级性能测试、前端性能测试等属于比较细分的领域,建议大家有需要的时候针对性得去学......
  • 12MnNiVR力学性能、12MnNiVR期货订轧、12MnNiVR化学成分
    一、12MnNiVR钢板简介:12MnNiVR是舞钢产锅炉压力容器用钢板,12MnNiVR是一种大型储油罐用钢板,依据相关设计院对钢板的设计要求而制定的,执行标准:执行GB/WYJ标准。二、12MnNiVR......
  • 让你用Undertow你不听,非用Tomcat,性能对比来了!
    在今天的互联网应用开发中,对于Web应用服务器的选择,往往是影响应用性能的重要因素之一。常见的Web应用服务器有很多,其中,Tomcat和Undertow是比较常用的两个Web应用服务器,它们......
  • 读Java性能权威指南(第2版)笔记20_垃圾回收G
    1. Survivor空间1.1. 新生代被划分为两个Survivor空间和一个Eden空间的原因1.1.1. 刚刚被创建并且还在使用中,所以不能被回收,但它们的寿命并没有长到足以进入老年代......
  • 为SEO提供基础的软硬件设施(域名、加密、性能)
    首先要有一个好的域名取一个好的名字取一个简短而又令人难忘的域名名字非常重要,域名最好和网站的名字一致,不但利于SEO,同时也帮助用户在忘记收藏你网站时,通过网站名联系......
  • Java中使用字节流和字符流操作文件的几种方法和性能对比
    注:本文转自:https://mp.weixin.qq.com/s/QuFkw-f1l0kyOqsBNNrRmw在Java中操作文件的方法本质上只有两种:字符流和字节流,而字节流和字符流的实现类又有很多,因此在文件写入......
  • 用 DolphinDB 和 Python Celery 搭建一个高性能因子计算平台
    因子挖掘是量化金融研究和交易的核心工作。传统的开发流程中,通常使用Python从关系型数据库(如SqlServer,Oracle等)读取数据,在Python中进行因子计算。随着证券交易规模......
  • 传统企业,如何构建性能测试技术体系
    之前有朋友介绍,帮一家知名的美妆零售企业,做过一次技术咨询,给我的个人感触还是比较大的。可能是我在互联网企业工作的比较久,已经习惯了尝试新鲜技术和方法,通过快速的工程......
  • react hooks 渲染性能
    目录目录重复渲染React.memo()例子React.useMemo例子React.useMemo也可以绑定jsx和tsx对象React.useCallback()例子重复渲染简介:在react中prop......